Javascript 检查对象的属性是否存在,并且只更新另一个属性
我有一个数组,其中的对象如下所示:Javascript 检查对象的属性是否存在,并且只更新另一个属性,javascript,arrays,object,Javascript,Arrays,Object,我有一个数组,其中的对象如下所示: let arr = [ { taxonomy: 'category', id: [ 10, 100 ] }, { taxonomy: 'post_tag', id: [ 20 ] }, ]; const object = { taxonomy: 'category', id: 30 } 我希望能够在数组中推送一个新对象,如下所示: let arr = [
let arr = [
{ taxonomy: 'category', id: [ 10, 100 ] },
{ taxonomy: 'post_tag', id: [ 20 ] },
];
const object = {
taxonomy: 'category',
id: 30
}
我希望能够在数组中推送一个新对象,如下所示:
let arr = [
{ taxonomy: 'category', id: [ 10, 100 ] },
{ taxonomy: 'post_tag', id: [ 20 ] },
];
const object = {
taxonomy: 'category',
id: 30
}
我想要的是检查数组中属性值为“taxonomy”的对象是否已经存在,如果已经存在,我只想将新对象的id添加到现有对象中。我知道如何检查属性是否已经存在,但我不知道如何将新id添加到数组中
因此,添加上述对象将生成此数组:
[
{ taxonomy: 'category', id: [ 10, 100, 30 ] }, // 30 is added
{ taxonomy: 'post_tag', id: [ 20 ] },
];
如果它还不存在,应该添加它。
有人能帮我吗?使用Array.find()
在数组中查找具有相同分类法的对象。如果存在,请将id
添加到它。如果没有,请将对象的克隆推入阵列(将对象的id
转换为阵列后):
const addUpdate=obj=>{
const current=arr.find(o=>obj.taxonomy===o.taxonomy);
如果(当前)当前id推送(对象id);
否则推({
…obj,
id:[对象id]
})
};
常数arr=[
{taxonomy:'category',id:[10100]},
{分类法:'post_tag',id:[20]},
];
addUpdate({taxonomy:'category',id:30});
addUpdate({taxonomy:'other',id:50});
控制台日志(arr)
您可以找到数组,并将id为as array的新对象更新或推送到数组中
const
数组=[{taxonomy:'category',id:[10100]},{taxonomy:'post_tag',id:[20]}];
对象={taxonomy:'category',id:30},
item=array.find(({taxonomy})=>object.taxonomy===taxonomy);
如果(项目){
item.id.push(object.id);
}否则{
array.push(Object.assign({},Object,{id:[Object.id]}));
}
console.log(数组);
//卸下最后一个插件
//查找具有分类法和id的项
item=array.find({taxonomy,id})=>object.taxonomy===taxonomy&&id.includes(object.id));
//使用索引从id中删除
如果(项目)项目id.splice(项目id.indexOf(对象id)),则为1;
console.log(数组)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以使用函数forEach
循环和推送新id
let arr=[{taxonomy:'category',id:[10100]},{taxonomy:'post_tag',id:[20]},],
object={taxonomy:'category',id:30};
arr.forEach(({taxonomy,id})=>{
if(object.taxonomy===分类法){
id.push(object.id);
}
});
控制台日志(arr)代码>使用下面的upsert()
函数,您可以通过一点抽象来实现这一点,这样它就可以被重用,而不仅仅是用于这个特定的模式upsert()
包含一些合理的函数默认值,如果所有对象都是具有基元值的字典,那么这些函数就可以正常工作
函数向上插入(
数组,对象,键fn,
updateFn=(目标,对象)=>object.assign(目标,对象),
insertFn=object=>object
) {
常量键=键FN(对象)
常量索引=array.findIndex(
值=>keyFn(值)==key
)
if(index!=-1)updateFn(数组[index],对象)
else数组.push(insertFn(对象))
}
设arr=[
{taxonomy:'category',id:[10100]},
{分类法:'post_tag',id:[20]}
]
const obj={taxonomy:'category',id:30}
向上插入(
啊,obj,,
o=>o.taxonomy,//用于确定是否应更新现有对象
(t,o)=>t.id.push(o.id),//更新现有对象的操作
({id,…o})=>({…o,id:[id]})//返回要插入的新对象
)
console.log(arr)
if(arr[0].taxonomy)…
由于您的对象只有两个看起来像键和值的属性,您是否考虑过使用对象而不是数组let obj={category:[10100],post_tag:[20]}
这将简化对匹配分类法的搜索。谢谢,@Nina Scholz非常有用!您还可以告诉我如何在if语句中检查item.id是否已存在于数组中,以便将其从数组中删除吗?在这种情况下,您可以使用相同的回调函数检查值是否不等-1
,如果只有一个项,则使用此索引拼接数组,或者过滤数组并将过滤后的数组分配给array
。谢谢,我似乎不知道怎么做。。我似乎不明白out@keviniooooooo,我添加了一个如何删除现有id
的示例。谢谢@Nina Scholz,我觉得有点困惑,是否应该将示例添加到第一个if语句中?一些上下文:我将所有这些代码放在一个函数中,该函数是在checkbox onChange事件中触发的