итерация массива объектов и сохранение значений - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть эти объекты в Javascript:

products = {
    {
      family : 'mugs', name :'black mug' , article_id : 1728 
    },
    {
      family : 'tees', name :'red t-shirt' , article_id : 1332 
    },
    {
      family : 'mugs', name :'tea white mug' , article_id : 2748 
    },
    {
      family : 'tees', name :'green woman t-shirt' , article_id : 1332 
    },
}

Я хочу сгруппировать article_ids в одном семействе. Я хочу получить этот результат :

grouped_products = {
    {
      family : 'mugs', articles_ids : '1728,2748' //only mugs articles ids
    },
    {
      family : 'tees', articles_ids : '1332,1332' //only tees articles ids
    },
}

Я пытаюсь использовать методы forEach и filter, но я не знаю, как это сделать в режиме выполнения.

Ответы [ 5 ]

1 голос
/ 14 февраля 2020

const products = [{family : 'mugs', name :'black mug' , article_id : 1728}, {family : 'tees', name :'red t-shirt' , article_id : 1332 }, {family : 'mugs', name :'tea white mug' , article_id : 2748}, {family : 'tees', name :'green woman t-shirt' , article_id : 1332}];

const grouped_products = products.reduce((acc, {family, article_id}) => {
    const i = acc.findIndex(p => p.family === family);
    if(i !== -1) {
      return [
        ...acc.slice(0, i),
        {...acc[i], article_id: (acc[i].article_id + ',' + article_id)},
        ...acc.slice(i + 1, acc.length)
      ];
    }
    return [...acc, {family, article_id}];
}, []);

console.log(grouped_products);
0 голосов
/ 14 февраля 2020
let products = [
    {
      family : 'mugs', name :'black mug' , article_id : 1728 
    },
    {
      family : 'tees', name :'red t-shirt' , article_id : 1332 
    },
    {
      family : 'mugs', name :'tea white mug' , article_id : 2748 
    },
    {
      family : 'tees', name :'green woman t-shirt' , article_id : 1332 
    }
]

function insertItem(accum,val){
    accum[val.family] = accum[val.family] ?  accum[val.family] + "," +  val.article_id : val.article_id ;
    return accum;
}

let mapped = products.reduce(insertItem,{});
let grouped = [];
Object.keys(mapped).map((key)=> grouped.push({"family":key, "article_ids":mapped[key]}))

Сначала я просто группирую все по семейству, используя объект в качестве ассоциативного массива

Затем я использую условное присваивание с? добавить значение с предшествующей запятой, если есть одно

Я не уверен, если вы действительно хотели значения с разделением запятыми или массив для article_ids, но если вы хотели запятые, это должно работать

0 голосов
/ 14 февраля 2020

Поскольку @terry сказал, что продукты должны быть в виде массива:

products = [
    {
        family : 'mugs', name :'black mug' , article_id : 1728 
    }, 
    {
        family : 'tees', name :'red t-shirt' , article_id : 1332 
    }, 
    {
        family : 'mugs', name :'tea white mug' , article_id : 2748 
    }, 
    {
        family : 'tees', name :'green woman t-shirt' , article_id : 1332 
    }
];

Теперь, чтобы получить желаемый результат, вы можете сделать это:

let group= products.reduce((prev, curr) => {
   let i = prev.findIndex(item => item.family === curr.family);

   if(i > -1){
       prev[i].article_ids.push(curr.article_id);
   }else{
       prev.push({
           family: curr.family, 
           article_ids: [curr.article_id]
       });
    }
    return prev;
},[]);
0 голосов
/ 14 февраля 2020
let grouped_products = {};

products.forEach(p => {
    grouped_products[p.family] = [...grouped_products[p.family], p.article_id];
})

// to make an array of object by family, as you wish
grouped_products = 
    Object.keys(grouped_products).map(k => { family: k, articles_ids: grouped_products[k] });
0 голосов
/ 14 февраля 2020

l oop на продуктах и ​​используйте карту, где ключ - это семейство, а значение - идентификатор статьи. Затем продолжайте добавлять идентификаторы статей для семьи на карте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...