Группа lodash по всем ключам самый эффективный способ - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь найти эффективный способ агрегирования всех элементов коллекции.

Например, что было бы с Lodash наиболее эффективным способом сгруппировать эту коллекцию объектов по каждому из ее ключей (подробно) если значения не являются подобъектами или массивами?

let input = [{
    food: {
        fruits: {
            apples: 2,
            bananas: 3,
            peaches: 'square',
            citrus: [100,200,300] 
        },
        meat: {
            beef: 1000,
            chicken: 2000
        }
    }
},{
    food: {
        fruits: {
            apples: 4,
            bananas: 5,
            peaches: 'triangle',
            citrus: [101,201,301] 
        },
        meat: {
            beef: 1001,
            chicken: 2001
        }
    }
}];

let output = {
    food: {
        fruits: {
            apples: [2,4],
            bananas: [3,5],
            peaches: ['square', 'triangle'],
            citrus: [[100,101],[200,201],[300,301]]
        },
        meat: {
            beef: [1000, 1001],
            chicken: [2000, 2001]
        }
    }
}

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

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете использовать mergeWith() следующим образом:

const output = _.mergeWith({}, ...input, (t, s) => {
  if (!_.isObject(s)) return t ? [...t, s] : [s]
});

const input = [{
  food: {
    fruits: {
      apples: 2,
      bananas: 3,
      peaches: 'square',
      citrus: [100, 200, 300]
    },
    meat: {
      beef: 1000,
      chicken: 2000
    }
  }
}, {
  food: {
    fruits: {
      apples: 4,
      bananas: 5,
      peaches: 'triangle',
      citrus: [101, 201, 301]
    },
    meat: {
      beef: 1001,
      chicken: 2001
    }
  }
}];

const output = _.mergeWith({}, ...input, (t, s) => {
  if (!_.isObject(s)) return t ? [...t, s] : [s]
});

console.log(output);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Возвращает именно тот результат, который вам нужен (после исправления несоответствий ввода):

{
  "food": {
    "fruits": {
      "apples": [2, 4],
      "bananas": [3, 5],
      "peaches": ["square", "triangle"],
      "citrus": [[100, 101], [200, 201], [300, 301]]
    },
    "meat": {
      "beef": [1000, 1001],
      "chicken": [2000, 2001]
    }
  }
}
...