我有一个对象数组,如下所示:
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 ] },
];
如果尚不存在,则应添加。 有人可以帮我吗?
答案 0 :(得分:2)
使用Array.find()
在数组中找到具有相同分类法的对象。如果存在,则将id
添加到其中。如果没有,将对象的副本放入数组中(将对象的id
转换为数组后):
const addUpdate = obj => {
const current = arr.find(o => obj.taxonomy === o.taxonomy);
if(current) current.id.push(obj.id);
else arr.push({
...obj,
id: [obj.id]
})
};
const arr = [
{ taxonomy: 'category', id: [ 10, 100 ] },
{ taxonomy: 'post_tag', id: [ 20 ] },
];
addUpdate({ taxonomy: 'category', id: 30 });
addUpdate({ taxonomy: 'other', id: 50 });
console.log(arr);
答案 1 :(得分:1)
您可以找到数组,并使用id
作为数组更新或推送新对象。
const
array = [{ taxonomy: 'category', id: [ 10, 100 ] }, { taxonomy: 'post_tag', id: [ 20 ] }];
object = { taxonomy: 'category', id: 30 },
item = array.find(({ taxonomy }) => object.taxonomy === taxonomy);
if (item) {
item.id.push(object.id);
} else {
array.push(Object.assign({}, object, { id: [object.id] }));
}
console.log(array);
// remove the last insert
// find item with taxonomy and id
item = array.find(({ taxonomy, id }) => object.taxonomy === taxonomy && id.includes(object.id));
// remove from id by using the index
if (item) item.id.splice(item.id.indexOf(object.id), 1);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
您可以使用函数forEach
来循环并推送新ID。
let arr = [{taxonomy: 'category',id: [10, 100]},{taxonomy: 'post_tag',id: [20]},],
object = {taxonomy: 'category',id: 30};
arr.forEach(({taxonomy, id}) => {
if (object.taxonomy === taxonomy) {
id.push(object.id);
}
});
console.log(arr);
答案 3 :(得分:0)
使用如下所示的valueIndex
函数,您可以通过一点抽象来实现此目的,以便可以将其重用于不仅仅是特定的模式。 upsert()
包含一些合理的函数默认值,如果所有对象都是带有原始值的字典,这些默认值就可以正常工作
upsert()