【问题标题】:How to Convert a nested array to an object如何将嵌套数组转换为对象
【发布时间】:2018-03-03 03:30:34
【问题描述】:

我想从只有 2 层深的嵌套数组创建一个对象。我想出的函数返回

[{ key1: 'value1', key2: 'value2' }]

而不是

[{ key1: 'value1' }, {key2: 'value2' }]

我也尝试将 if 语句替换为 obj[elem[0]] = elem[1];,但得到了相同的结果。

如何为每个嵌套数组创建单独的对象?

var array = [["key1", "value1"], ["key2", "value2"]]

function nestedArrToObj(array){

  let obj = {};

  for (let i=0; i < array.length;i++) {
    let elem = array[i];

    if (!(obj[elem[0]])) {
      obj[elem[0]] = elem[1]
    }
  }

  return [obj];
}

【问题讨论】:

    标签: javascript object for-loop


    【解决方案1】:

    使用函数map

    let array = [["key1", "value1"], ["key2", "value2"]];
    let result = array.map(([key, value]) => ({[key]: value}));
    
    console.log(result)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    使用函数reduce

    let array = [["key1", "value1"], ["key2", "value2"]];
    let result = array.reduce((a, c) => {
      let [key, value] = c;
      return [...a, {[key]: value}];
    }, []);
    
    console.log(result)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    跨浏览器和后端技术兼容方法:

    var array = [["key1", "value1"], ["key2", "value2"]];
    
    var result = [];
    for(var a of array) {
      var value = a.pop();
      var key = a.pop();
      
      var object = {};
      object[key] = value;
      
      result.push(object);
    }
    
    console.log(result)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 感谢您的回复,但我试图将每个嵌套数组作为 separate 对象
    • 那么对于在这一行中使用reduce 的答案-let [key, value] = c;-您可以将c 中的数组“解包”为单独的数组对象吗?像我可以使用c[0] 代替您回答中的关键吗?
    • @e1v1s 这就是所谓的解构赋值,基本上是获取索引 0 和 1 并将这些值分配给 keyvalue - Destructuring assignment
    • 其实map在这里比reduce更合适,因为它是N->N而不是N->1变换。
    • @georg 你是对的,我更新了答案。函数map 真的很简单。
    【解决方案2】:

    这是一个带有map的版本:

    console.log(
      [["key1", "value1"], ["key2", "value2"]]
          .map(x => {let obj = {}; obj[x[0]] = x[1]; return obj;})
    )

    【讨论】:

    • 是的,.map 在这里是正确的,在 ES6 中:a.map(([k, v]) =&gt; ({[k]: v}))
    • @georg 谢谢!我正在寻找如何分配这样的密钥,lol
    【解决方案3】:

    该语言的一些新功能使这更容易一些。这是一个 ES5 解决方案。

    var array = [["key1", "value1"], ["key2", "value2"]]
    
    function nestedArrToObj(array){
      return array.reduce(function(previous, current) {
          let obj = {};
          obj[current[0]] = current[1];
          previous.push(obj);
          return previous;
      }, []);
    }
    
    console.log(nestedArrToObj(array))

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 1970-01-01
      • 2017-11-15
      • 2020-07-03
      • 1970-01-01
      • 2015-03-26
      • 2019-01-31
      相关资源
      最近更新 更多