【问题标题】:lodash groupBy all keys most efficient waylodash groupBy all keys 最有效的方式
【发布时间】:2018-06-04 18:45:23
【问题描述】:

我正在尝试找到一种有效的方法来聚合集合中的所有项目。

例如,如果值不是子对象或数组,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 中似乎没有一个函数可以执行此操作,我想知道是否有一种方法可以一次性完成此操作,而无需在初始集合上多次迭代。

【问题讨论】:

  • 输出citrus有3个数组,不是2个,是故意的吗?
  • 与所有这些类型的问题一样,您需要查看Array.prototype.reduce
  • 另外,第一项具有peach,第二项具有peachescitruscritusbeaf 的类似问题可能应该是 beef。编程中的拼写问题
  • 是的,对不起,我直接在这里编辑了我的示例,我应该在 IDE 中完成。它是固定的,对于柑橘,它应该是一个数组数组,假设集合的所有项目在属性大小等方面都是同质的。

标签: javascript grouping lodash


【解决方案1】:

你可以使用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]
    }
  }
}

【讨论】:

  • 我不知道我是如何在文档中错过它的,这可能与我犯了这么多不一致的错别字的原因相同:我应该多睡 :)。感谢您的回答,这正是我想要的。
猜你喜欢
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多