如何将值数组分配为另一个值数组的键?

3

最佳的转换方式是什么?

{
   "columns":[
      "name",
      "color"
   ],
   "values":[
      [
         "lion",
         "yellow"
      ],
      [
         "crow",
         "black"
      ]
   ]
}

转换为

{
   "data":[
      {
        "name":"lion",
        "color":"yellow"
      },
      {
         "name":"crow",
         "color":"black"
      }
   ]
}

有没有可用的函数代替循环?我可以通过类似于extend()的方法实现吗?
3个回答

4

你可以使用Object.assign扩展语法...来处理这些部分。

var object = { columns: ["name", "color"], values: [["lion", "yellow"], ["crow", "black"]] },
    result = { data: object.values.map(v => Object.assign(...object.columns.map((c, i) => ({[c]: v[i]})))) };

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


2

您可以使用解构赋值、扩展运算符和for...of循环来获取.columns数组的值,通过迭代原始对象的.values属性将.columns数组的计算属性作为字符串分配给data数组中的对象属性,并将每个数组的值分配为创建的对象的值。

let obj = {
   "columns":[
      "name",
      "color"
   ],
   "values":[
      [
         "lion",
         "yellow"
      ],
      [
         "crow",
         "black"
      ]
   ]
}

let [res, key, value] = [{data:Array()}, ...obj.columns];

for (let [a, b] of [...obj.values]) res.data.push({[key]:a, [value]:b});

console.log(res);


2

您可以通过使用map和reduce的组合来实现。将原始列数组进行缩减,使代码能够处理任何数量的列,它将通过索引选择相应的值:

const result = {data: data.values.map(el => {
  return data.columns.reduce((prev, curr, index) => {
    prev[curr] = el[index]
    return prev
  }, {})
})}

请查看下面的演示。

const data = {
   "columns":[
      "name",
      "color"
   ],
   "values":[
      [
         "lion",
         "yellow"
      ],
      [
         "crow",
         "black"
      ]
   ]
}

const result = {data: data.values.map(el => {
  return data.columns.reduce((prev, curr, index) => {
    prev[curr] = el[index]
    return prev
  }, {})
})}

console.log(result)


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