如何用 Lodash.js 反转 collection/array?

How to unpivot a collection/array with Lodash.js?

我是 JavaScript 的初学者,我想取消 collection/array。

我有一个这样的 collection/array :

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

我想将我的 collection/array 转换为这样的东西:

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 的文档中找到一些东西,但我不知道该怎么做。

您可以将剩余对象的 _.flatMap(), by destructuring the produit key for each object and then mapping the 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>

你不需要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; }