Свойства поиска и обновления объекта, вложенного в массив Javascript - PullRequest
0 голосов
/ 09 мая 2018

Скажем, у меня есть массив вложенных объектов, таких как

let vendors = [
    {
        v_id: 'red',
        count: 2,
    },
    {
        v_id: 'blue',
        count: 3,
    },
    {
        v_id: 'green',
        count: 1,
    },
];

И еще один объект "foo" со многими свойствами, одним из которых является "v_id". Основываясь на значении foo.v_id, я хочу либо обновить счетчики в массиве «vendors», либо добавить новый объект в «vendors».

Если foo.v_id совпадает с одним из значений в массиве vendors, соответствующий счет увеличивается на 1.

Пример:

let foo = {
    user_type: 'Other',
    v_id: 'blue'
};

Тогда «продавцами» станут:

[
    {
        v_id: 'red',
        count: 2,
    },
    {
        v_id: 'blue',
        count: 4,
    },
    {
        v_id: 'green',
        count: 1,
    },
];

Иначе, если нет совпадения с v_id, в массив "vendors" добавляется новый объект с соответствующим v_id & count = 1.

Пример:

let foo = {
    user_type: 'client',
    v_id: 'yellow',
};

Тогда "продавцами" станут:

[
    {
        v_id: 'red',
        count: 2,
    },
    {
        v_id: 'blue',
        count: 3,
    },
    {
        v_id: 'green',
        count: 1,
    },
    {
        v_id: 'yellow',
        count: 1,
    },
];

Как я могу эффективно и элегантно сделать это в Javascript? Я знаю, что могу использовать .filter(), чтобы получить конкретный объект в "vendors", который нужно обновить, но как мне обновить сам массив "vendors"?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

function upsert(arr, obj){
  const index = arr.findIndex(item => item.v_id === obj.v_id);
  index === -1 ? arr.push({v_id: obj.v_id, count: 1}) : arr[index].count++
}

let vendors = [{v_id: 'red',count: 2}, {v_id: 'blue',count: 3}, {v_id: 'green',count: 1}];
let foo1 = {user_type: 'Other', v_id: 'blue'};
let foo2 = {user_type: 'client', v_id: 'yellow'};

upsert(vendors, foo1);
upsert(vendors, foo2);

console.log(vendors);
0 голосов
/ 09 мая 2018

Используйте Array.find() для поиска объекта в массиве по v_id. Если объект находится в массиве, увеличьте count. Если нет, нажмите новый объект:

const vendors = [{"v_id":"red","count":2},{"v_id":"blue","count":3},{"v_id":"green","count":1}];
const foo1 = { user_type: 'Other', v_id: 'blue' };
const foo2 = { user_type: 'client', v_id: 'yellow' };

const addUpdate = (arr, obj) => {
  const current = arr.find((o) => o.v_id === obj.v_id);
  
  if(current) current.count += 1;
  else arr.push({
    v_id: obj.v_id,
    count: 1
  });
};

addUpdate(vendors, foo1);
addUpdate(vendors, foo2);

console.log(vendors);
...