【问题标题】:How to assign Array of values as keys to another array of values?如何将值数组作为键分配给另一个值数组?
【发布时间】:2017-09-09 23:32:41
【问题描述】:

什么是最好的转换方式,

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

进入

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

而不是循环,有没有可用的功能?我可以通过 extend() 之类的方法来实现它吗?

【问题讨论】:

    标签: javascript jquery angularjs arrays json


    【解决方案1】:

    您可以使用Object.assignspread syntax ... 作为零件。

    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】:

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

      【讨论】:

        【解决方案3】:

        你可以使用解构赋值、展开元素来获得.columns数组的值; for..of 循环通过迭代原始对象的 .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);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-07
          • 1970-01-01
          • 1970-01-01
          • 2017-01-29
          • 1970-01-01
          • 2017-06-29
          相关资源
          最近更新 更多