javascript 将带有数组对象转换为带有对象的数组的最佳方法,反之亦然

0dxa2lsx  于 2022-11-20  发布在  Java
关注(0)|答案(4)|浏览(138)

将数组对象转换为对象数组的最佳方法是什么,反之亦然

{
  category : ['a','b','c'],
  title : ['e','f','g'],
  code : ['z','x','v']
}

结束日期

[
  {
    category : 'a',
    title : 'e',
    code : 'z'
  },
  {
    category : 'b',
    title : 'f',
    code : 'x'
  },
  {
    category : 'c',
    title : 'g',
    code : 'v'
  },
]
13z8s7eq

13z8s7eq1#

可以使用两个函数来生成数组或对象。

第一个

f45qwnt8

f45qwnt82#

您可以使用map()forEach()

var obj = {
  category : ['a','b','c'],
  title : ['e','f','g'],
  code : ['z','x','v']
}

var result = Object.keys(obj).map(function(e, i) {
  var o = {}
  Object.keys(obj).forEach((a, j) => o[a] = obj[a][i])
  return o
})

console.log(result)
1aaf6o9v

1aaf6o9v3#

下面是使用reduce方法和arrow函数的解决方案。

var obj={
  category : ['a','b','c'],
  title : ['e','f','g'],
  code : ['z','x','v']
}
var result=obj[Object.keys(obj)[0]].reduce((a,b,i)=>{
  var newObj={};
  Object.keys(obj).forEach(function(item){
     newObj[item]=obj[item][i];
  });
  return a.concat(newObj);
},[]);
console.log(result);
yzuktlbb

yzuktlbb4#

这并不是最初问题的答案,但我想在我来这里寻找一个相关问题的解决方案时分享这个答案:我需要长度不等的值的笛卡尔积。我使用的是:

/**
 * Get the Cartesian product of a list of array args.
 */
const product = (...args) => args.length === 1
  ? args[0].map(x => [x])
  : args.reduce(
    (a, b) => Array.from(a).flatMap(
        v1 => Array.from(b).map(v2 => [v1, v2].flat())
    )
  );

/**
 * Map[String,Array[Any]] -> Array[Map[String,Any]]
 */
const arrayValuesToObjectArray = (obj) =>
  product(...Object.values(obj)).map(values => Object.fromEntries(
    Object.keys(obj).map((k, idx) => [k, values[idx]])
  ));

console.log(arrayValuesToObjectArray({
  hello: ["this", "is", "a", "test"]
}));

console.log(arrayValuesToObjectArray({
  one: ["foo"],
  two: ["bar", "baz"],
  three: ["this", "is", "three"],
}));

console.log(arrayValuesToObjectArray({
  one: "foo",
  two: "bar baz",
  three: "this is three",
}));

相关问题