检查对象的属性是否存在,仅更新另一个属性

时间:2019-04-25 20:08:15

标签: javascript arrays object

我有一个对象数组,如下所示:

    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 ] },
    ];

如果尚不存在,则应添加。 有人可以帮我吗?

4 个答案:

答案 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()