将带有数组的对象转换为对象数组和将对象数组转换为带有数组的对象的最佳方法是什么?

7
什么是将数组对象转换为对象数组或反之的最佳方法?
{
  category : ['a','b','c'],
  title : ['e','f','g'],
  code : ['z','x','v']
}

To

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

Object.keys() + Array.reduce() - Shilly
@Amir,它对你有效吗? - Mihai Alexandru-Ionut
@Alexandru-IonutMihai 嗯,谢谢 :) - amir hosein ahmadi
@amirhoseinahmadi,请不要忘记接受答案,以帮助其他人。 - Mihai Alexandru-Ionut
4个回答

6
你可以使用两个函数来生成数组或对象。它们分别是:
- 通过Object.keys获取所有自身属性的名称; - 通过Array#reduce遍历数组并收集返回项; - 通过Array#forEach仅用于迭代数组。

function getArray(object) {
    return Object.keys(object).reduce(function (r, k) {
        object[k].forEach(function (a, i) {
            r[i] = r[i] || {};
            r[i][k] = a;
        });
        return r;
    }, []);
}

function getObject(array) {
    return array.reduce(function (r, o, i) {
        Object.keys(o).forEach(function (k) {
            r[k] = r[k] || [];
            r[k][i] = o[k];
        });
        return r;
    }, {});
}

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

console.log(getArray(data));
console.log(getObject(getArray(data)));
.as-console-wrapper { max-height: 100% !important; top: 0; }


绝对惊人。 - kind user

2
您可以使用 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)


1
这里是使用reduce方法和箭头函数的解决方案。

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);


-1

虽然这不是对原问题的回答,但我想分享一下,因为我来到这里是为了寻找相关问题的解决方案:我需要不同长度值的笛卡尔积。我使用的方法是:

/**
 * 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",
}));


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