Javascript根据键更新数组数据
Posted
技术标签:
【中文标题】Javascript根据键更新数组数据【英文标题】:Javascript update a array data depending on key 【发布时间】:2022-01-22 20:24:36 【问题描述】:我有一个简单的数组,我想用值 order:"asc"
更新这个数组,并且仅当 type == "user"
和 key == "country"
时才想删除所有其他 order
键
const items = [
type: "user",
values: [
order:"asc", key:"first_name",
key:"last_name",
key:"address",
key:"country",
]
,
]
我的预期结果是
const items = [
type: "user",
values: [
key:"first_name",
key:"last_name",
key:"address",
order:"asc", key:"country",
]
,
]
我可以在map
中使用map
来做到这一点。是否可以不循环两次?
items.map(
x => if (x.type == "user")
x.values = x.values.map(y =>
if (y.key.includes("country"))
y.order = "asc"
else if (JSON.stringify(x.values).includes("country"))
delete y.order
return y
)
return [x]
);
【问题讨论】:
您的问题中唯一实际的JSON 是JSON.stringify(x.values)
的结果-并且该调用不是必需的,只是增加了不良行为的潜在来源。
我认为没有双循环是不可能做到这一点的。因为你有两个独立的数组。每个数组都必须有一个循环。 Map、filter、foreEach 都有一个循环。
【参考方案1】:
如果您不想删除order:"asc"
,如果values
数组中没有country
,那么在values
中的每个对象上而不是JSON.stringify(x.values).includes("country")
,您可以使用.find()
,然后只循环如果有key:"country"
的对象,则删除:
const items = [ type: "user", values: [ order:"asc", key:"first_name", key:"last_name", key:"address", key:"country", ] , ]
const result = items.map(obj =>
if (obj.type === 'user')
const country = obj.values.find(o => o.key === 'country')
if (country)
obj.values.forEach(value => delete value.order)
country.order = 'asc'
return obj
)
console.log(result)
.as-console-wrappermin-height:100%
【讨论】:
【参考方案2】:items.filter(itm => itm.type == "user")
.map(u => u.values.map(v =>
delete v.order
if (u.values.key == "country")
u.values.order = "asc"
)
);
【讨论】:
【参考方案3】:我认为只有双循环才能做到这一点。我写了这个脚本,但它和你的相似。
var newItems = items.map(el =>
if(el.type === "user")
el.values = el.values.map(value =>
if(value.key === "country")
value["order"] = "asc"
else if(value["order"] != undefined)
delete value["order"]
return value
)
return el
)
【讨论】:
如果我有key:"country",
,它就可以工作。如果我没有这个country
键,那么它会从项目order:"asc", key:"first_name",
中删除order:asc
。如果值不包含country
,我不想删除order:"asc"
。【参考方案4】:
逻辑
循环遍历items
数组。
使用type
查找节点"type"
从该节点循环遍历values
数组。
清除 "order"
的 key 不是 "country"
的节点
将"order"
添加为"asc"
,其中键为"country"
工作小提琴
const items = [
type: "user",
values: [
order: "asc", key: "first_name" ,
key: "last_name" ,
key: "address" ,
key: "country" ,
]
,
];
items.filter(item => item.type === "user").forEach(item =>
item.values.filter(value => value.order === "asc").forEach(value => value.order && value.key !== "country" ? delete value.order : );
item.values.filter(value => value.key === "country").forEach(value => value.order = "asc");
);
console.log(items);
【讨论】:
以上是关于Javascript根据键更新数组数据的主要内容,如果未能解决你的问题,请参考以下文章
如何根据javascript中的键合并和替换两个数组中的对象?