Преобразование массива в объект и подсчет дубликатов javascript

#javascript #arrays

#javascript #массивы

Вопрос:

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

 {
    "BLACK": {
    "XXS": 1,
    "M": 1,
    "L": 1,
    "XL": 2 "},
    "WHITE": {
    "XXS": 1,
    ...
}
  

Я пытался использовать reduce и split, но он возвращает примерно так:

 const products = ["black-XXS", "black-M", "black-L", "black-XL", "black-XL", "white-XXS", "white-L", "red-M "," blue-2XL "," blue-2XL "," blue-2XL "]

var result = products.reduce ((prev, cur) => {
    color = cur.split ("-") [0]
    size = cur.split ("-") [1]

    // prev [size] = (prev [size] || 0)   1
    previous [color] = {[size]: ([size] || 0)   1}
    // prev [color] = {[size]: (prev [size] || 0)   1}
    // {[color] = {[size]: ([size] || 0)   1}}

    // console.log (previous)
    return prev;
}, {});

Result = {"black": {"XL": "XL1"}, "white": {"L": "L1"}, "red": {"M": "M1"}, "blue": { "2XL": "2XL1"}}
  

Ответ №1:

Сначала вам нужно явно создать внешний объект, если он еще не существует, как отдельный оператор. Затем вы можете увеличить для него возможно существующее свойство size:

 const products = ["black-XXS", "black-M", "black-L", "black-XL", "black-XL", "white-XXS", "white-L", "red-M "," blue-2XL "," blue-2XL "," blue-2XL "]

const productsByColor = {};
for (const product of products) {
  const [color, size] = product.toUpperCase().split('-');
  if (!productsByColor[color]) {
    productsByColor[color] = {};
  }
  productsByColor[color][size] = (productsByColor[color][size] || 0)   1;
}
console.log(productsByColor);  

Ответ №2:

Я сделал это немного по-другому, но CertainPerformance прав, сначала вам нужно определить свой пустой объект. Я бы также посоветовал вам убедиться, что каждый элемент в вашем массиве соответствует аналогичному формату. Например, внутри строки есть пробелы " blue-2XL " .

Вот как я бы это сделал:

 const products = ["black-XXS", "black-M", "black-L", "black-XL", "black-XL", "white-XXS", "white-L", "red-M", "blue-2XL", "blue-2XL", "blue-2XL"]

const hash = {};
products.forEach(item => {
    let color = item.split("-")[0];
    let size = item.split("-")[1];
    if(!hash[color]) {hash[color] = {}};
    if(!hash[color][size]) {hash[color][size] = 1} else {hash[color][size] = hash[color][size]   1};
});
  

Если console.log(hash); вы должны иметь:

 { black: { XXS: 1, M: 1, L: 1, XL: 2 },
white: { XXS: 1, L: 1 },
red: { M: 1 },
blue: { '2XL': 3 } }