Проверьте, существует ли свойство объекта, и обновите только другое свойство. - PullRequest
1 голос
/ 25 апреля 2019

У меня есть массив с объектами, которые выглядят так:

    let arr = [
        { taxonomy: 'category', id: [ 10, 100 ] },
        { taxonomy: 'post_tag', id: [ 20 ] },
    ];

Я хочу иметь возможность выдвинуть новый объект в массиве, который выглядит следующим образом:

    const object = {
        taxonomy: 'category',
        id: 30
    }

Что я хочу, так это проверить, существует ли уже объект в массиве со значением свойства 'taxonomy', и если это так, я хочу добавить только идентификатор нового объекта в существующий объект.Я знаю, как проверить, существует ли свойство уже, но я точно не знаю, как добавить новый идентификатор в массив.

Таким образом, добавление вышеуказанного объекта приведет к следующему массиву:

    [
        { taxonomy: 'category', id: [ 10, 100, 30 ] }, // 30 is added
        { taxonomy: 'post_tag', id: [ 20 ] },
    ];

если он еще не существует, его следует добавить.Кто-нибудь может мне помочь с этим?

Ответы [ 4 ]

2 голосов
/ 25 апреля 2019

Используйте 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 голос
/ 25 апреля 2019

Вы можете найти массив и обновить или передать новый объект с 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; }
0 голосов
/ 25 апреля 2019

Используя функцию upsert(), как показано ниже, вы можете сделать это с небольшой абстракцией, чтобы ее можно было использовать не только для этой конкретной схемы.upsert() содержит некоторые разумные значения по умолчанию для функций, которые будут работать нормально, если все объекты являются словарями с примитивными значениями

function upsert (
  array, object, keyFn,
  updateFn = (target, object) => Object.assign(target, object),
  insertFn = object => object
) {
  const key = keyFn(object)
  const index = array.findIndex(
    value => keyFn(value) === key
  )

  if (index !== -1) updateFn(array[index], object)
  else array.push(insertFn(object))
}

let arr = [
  { taxonomy: 'category', id: [10, 100] },
  { taxonomy: 'post_tag', id: [20] }
]

const obj = { taxonomy: 'category', id: 30 }

upsert(
  arr, obj,
  o => o.taxonomy, // used to determine if existing object should be updated
  (t, o) => t.id.push(o.id), // operation for updating existing object
  ({ id, ...o }) => ({ ...o, id: [id] }) // return new object to insert
)

console.log(arr)
0 голосов
/ 25 апреля 2019

Вы можете использовать функцию forEach для зацикливания и отправки нового идентификатора.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...