Сократить несколько объектов в один - PullRequest
0 голосов
/ 12 ноября 2018

Допустим, у меня есть массив объектов:

[
    {
        category: 'Category A',
        max: 10,
        min: 12
    },

    {
        category: 'Category B',
        max: 2,
        min: 1
    },

    {
        category: 'Category C',
        max: 4,
        min: 4
    }
]

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

{
    category: 'Category ALL',
    max: 16,
    min: 17
}

Все мои попытки сделать с помощью Reduce не сработали.

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018

Вы можете использовать Array.reduce , чтобы массив объектов можно было сократить до одного объекта, а с помощью es6 вы можете написать в одну строку.

Пожалуйста, смотрите код ниже, я надеюсь, что это решит проблему

var res = [
    {
        category: 'Category A',
        max: 10,
        min: 12
    },

    {
        category: 'Category B',
        max: 2,
        min: 1
    },

    {
        category: 'Category C',
        max: 4,
        min: 4
    }
]

var result = res.reduce((a,c) =>  ({category:"Category All", max: a.max + c.max, min: a.min + c.min}))

console.log("result", result)
0 голосов
/ 12 ноября 2018

var array = [{
    category: 'Category A',
    max: 10,
    min: 12
  },

  {
    category: 'Category B',
    max: 2,
    min: 1
  },

  {
    category: 'Category C',
    max: 4,
    min: 4
  }
]

var result = array.reduce((a, v) => {
  a.max += v.max
  a.min += v.min
  return a
}, {
  category: "Category All",
  max: 0,
  min: 0
})

console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 12 ноября 2018

Просто передайте исходный объект { category: 'Category ALL', max: 0, min: 0 } в reduce, и для каждого элемента просто добавьте max и min к этому объекту:

let result = array.reduce((acc, obj) => {
    acc.max += obj.max;
    acc.min += obj.min;
    return acc;
}, { category: 'Category ALL', max: 0, min: 0 });

Пример:

let array = [{ category: 'Category A', max: 10, min: 12 }, { category: 'Category B', max: 2, min: 1 }, { category: 'Category C', max: 4, min: 4 }];

let result = array.reduce((acc, obj) => {
    acc.max += obj.max;
    acc.min += obj.min;
    return acc;
}, { category: 'Category ALL', max: 0, min: 0 });

console.log(result);
0 голосов
/ 12 ноября 2018

Вы можете уменьшить данные, приняв min и max как сумму в объекте для следующей итерации.

var data = [{ category: 'Category A', max: 10, min: 12 }, { category: 'Category B', max: 2, min: 1 }, { category: 'Category C', max: 4, min: 4 }],
    result = Object.assign(
        { category: 'Category All' }, 
        data.reduce((a, b) => ({ min: a.min + b.min, max: a.max + b.max }))
    );
    
console.log(result);

Более динамичный подход с использованием массива для ключей.

var data = [{ category: 'Category A', max: 10, min: 12 }, { category: 'Category B', max: 2, min: 1 }, { category: 'Category C', max: 4, min: 4 }],
    keys = ['min', 'max'],
    result = Object.assign(
        { category: 'Category All' }, 
        data.reduce((a, b) => Object.assign(...keys.map(k => ({ [k]: a[k] + b[k] }))))
    );
    
console.log(result);
...