如何使用 Lodash.js 对集合/数组进行反透视?

Posted

技术标签:

【中文标题】如何使用 Lodash.js 对集合/数组进行反透视?【英文标题】:How to unpivot a collection/array with Lodash.js? 【发布时间】:2020-09-30 15:57:10 【问题描述】:

我是 javascript 的初学者,我想取消透视集合/数组。

我有一个这样的集合/数组:

[
   'produit': 'a', 'color': 'white', 'material': 'leather' , 
   'produit': 'b', 'attribute': 'black', 'material': 'wool' 
]

我想转换我的集合/数组以获得类似的东西:

var a = [
   'produit': 'a', 'attribute': 'color', 'value': 'white' , 
   'produit': 'a', 'attribute': 'material', 'value': 'leather' , 
   'produit': 'b', 'attribute': 'color', 'value' :'black' ,
   'produit': 'b', 'attribute': 'material', 'value': 'wool' 
]

我试图在 lodash.js 的文档中找到一些东西,但我不知道该怎么做。

【问题讨论】:

【参考方案1】:

您可以使用_.flatMap(),通过destructuring produit 键为每个对象,然后将mapping keys/values 剩余对象用于包含produit 键的新对象,键为attribute 键和 value 键的值:

const arr = [
   'produit': 'a', 'color': 'white', 'material': 'leather' , 
   'produit': 'b', 'attribute': 'black', 'material': 'wool' 
];

const res = _.flatMap(
  arr,
  (produit, ...r) => _.map(_.entries(r), ([attribute, value]) => (produit, attribute, value))
);

console.log(res);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

现在 JS 有很多内置的数组函数,所以在 vanilla JS 中也可以使用类似的方法实现上述功能:

const arr = [
   'produit': 'a', 'color': 'white', 'material': 'leather' , 
   'produit': 'b', 'attribute': 'black', 'material': 'wool' 
];

const res = arr.flatMap(
  (produit, ...r) => Object.entries(r).map(([attribute, value]) => (produit, attribute, value))
);

console.log(res);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

【讨论】:

【参考方案2】:

你不需要 lodash。您可以使用对象销毁和缩减轻松做到这一点。

const original = [
   'produit': 'a', 'color': 'white', 'material': 'leather' , 
   'produit': 'b', 'attribute': 'black', 'material': 'wool' 
]

const altered = original.reduce((acc, item) =>
  (( produit, ...rest ) =>
    Object.entries(rest).reduce((result, [attribute, value]) =>
      [ ...result,  produit, attribute, value  ], acc))(item), []);

console.log(altered);
.as-console-wrapper  top: 0; max-height: 100% !important; 

【讨论】:

以上是关于如何使用 Lodash.js 对集合/数组进行反透视?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用节点 js 对 mongoDB 中的集合内的数组进行排序

如果一个Object对象可能是集合或者数组那么如何对其进行迭代

如何获得符合 unsafe-eval 的 Fabric js 和 lodash js

如何根据数组的成员对集合进行排序

按属性值排序对象

如何在 MongoDB 中对集合记录中的数组进行排序?