JavaScript中将对象数组转换为集合的高效方法

3
const myObj = {
 a: [1, 2, 3],
 b: [2, 4, 6],
 c: [10, 20, 30]
}

介绍

const myCollection = [
  {a: 1, b: 2, c: 10},
  {a: 2, b: 4, c: 20},
  {a: 3, b: 6, c: 30}
]

我尝试过使用Object.entriesObject.keysmap的组合,但我总是发现自己在myObj上进行两次或更多的迭代,并且我对任何一个我想出的解决方案都不满意。 那么你能想到最有效率(以时间复杂度为标准)和优雅的方法是什么?

1
请分享您尝试过的代码。另外需要一些细节,您的A、B和C长度是否总是相同? - Alexandre Elshobokshy
5个回答

1

以防您需要可变长度:

const myObj = {
  a: [1, 2, 3],
  b: [2, 4, 6,8, 10],
  c: [10, 20, 30, 40],
};

let myCollection = [];

Object.keys(myObj).forEach((k) => {
  for (let i = 0; i < myObj[k].length; i++) {
    if (!myCollection[i]) myCollection.push({});
    myCollection[i][k] = myObj[k][i];
  }
});
console.log(myCollection);


0

可以使用Array.reduce来完成。我已经附上了转换代码。

const myObj = {
 a: [1, 2, 3],
 b: [2, 4, 6],
 c: [10, 20, 30]
}

const myCollection = [
  {a: 1, b: 2, c: 10},
  {a: 2, b: 4, c: 20},
  {a: 3, b: 6, c: 30}
]

const maxLength = Math.max(...Object.values(myObj).map(item => item.length));

const myObjKeys = Object.keys(myObj);
const result = [ ...Array(maxLength).keys() ].map((index) => {
  return myObjKeys.reduce((acc, curKey) => {
    if (myObj[curKey].length > index) {
      acc[curKey] = myObj[curKey][index];
    }
    return acc;
  }, {});
});
console.log(result);


0
使用 ramdajs,我可以向你建议以下简短的方法

const myObj = {
  a: [1, 2, 3],
  b: [2, 4, 6],
  c: [10, 20, 30]
}

const res = R.map(
  R.zipObj(R.keys(myObj)),
  R.values(myObj)
)

console.log(res)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

RamdaJS主页,第3个标准在有何不同中引用到:

Ramda函数的参数排列方式是为了方便柯里化。通常最后提供要操作的数据。


点赞优雅,但我不使用Ramda。但它确实给了我一个方向,如何使用Lodash实现相同的功能(几乎相同的函数)。 - baba-dev

0

你可以减少条目并映射嵌套数组。

const
    object = { a: [1, 2, 3], b: [2, 4, 6], c: [10, 20, 30] },
    result = Object
        .entries(object)
        .reduce((r, [k, a]) => a.map((v, i) => ({ ...r[i], [k]: v })), []);

console.log(result);


0
你可以在Object.values上使用map(),然后对每个值使用reduce()。

const myObj = {
 a: [1, 2, 3],
 b: [2, 4, 6],
 c: [10, 20, 30]
}

let keys = Object.keys(myObj);
const arr = Object.values(myObj).map((a) => a.reduce((ac, a, i) => ({...ac, [keys[i]]:a}), {}));
console.log(arr)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接