Я использую фильтр, чтобы найти все элементы в вложенном массиве. Но тогда я хотел бы изменить "количество" всех найденных предметов. Один и тот же элемент можно найти в нескольких категориях и подкатегориях.

Было бы неплохо, если бы я мог изменить его, как это, но он не работает ...

let item_id = 681
let new_quantity = 10

categories.flatMap(category => category.subcategories.flatMap(subcategory => subcategory.items))
          .filter(item => item.id == item_id)
          .item.quantity = new_quantity

Вот мои категории> подкатегории> массив элементов (я хочу изменить количество с 5 на 10, где item_id = 681)

[
    {
        id: 1,
        description: 'First category',
        subcategories: [
            {
                id: 1,
                description: 'First subcategory',
                items: [
                    {
                        id: 681,
                        description: 'House',
                        quantity: 5,
                    }
                ]
            }
        ]
    },

    {
        id: 2,
        description: 'Second category',
        subcategories: [
            {
                id: 1,
                description: 'First subcategory',
                items: [
                    {
                        id: 681,
                        description: 'House',
                        quantity: 5,
                    }
                ]
            }
        ]
    },
]
0
Liga 5 Ноя 2019 в 15:35

2 ответа

Лучший ответ

Используйте map вместо этого.

categories.flatMap(category => category.subcategories.flatMap(subcategory => subcategory.items))
   .map(item =>{
    if(item.id == item_id){
     item.quantity = new_quantity;
    }
   return item;
})
1
Vladimir Bogomolov 5 Ноя 2019 в 12:41

Если глубина вложенных категорий варьируется (например, у вас есть подкатегории), то это также может быть полезно:

let categories = [{id:1,description:"First category",subcategories:[{id:1,description:"First subcategory",items:[{id:681,description:"House",quantity:5}]}]},{id:2,description:"Second category",subcategories:[{id:1,description:"First subcategory",items:[{id:681,description:"House",quantity:5}]}]}];

let item_id = 681
let new_quantity = 10

function eachRecursive(obj, cb) {
    for (var k in obj) {
        cb(k, obj);
        if (typeof obj[k] == "object" && obj[k] !== null)
            eachRecursive(obj[k], cb);
    }
}

eachRecursive(categories, (key, obj) => {
  if(key === 'items') { 
    let itemIndex = obj[key].findIndex(item => item.id === item_id);
    obj[key][itemIndex].quantity = new_quantity; 
  }
});

console.log(categories);
0
Mischa 5 Ноя 2019 в 13:11