【问题标题】:Convert JavaScript array of 2 element arrays into object key value pairs将 2 个元素数组的 JavaScript 数组转换为对象键值对
【发布时间】:2014-10-19 19:48:21
【问题描述】:

从这样的东西中获取最快的算法是什么:

var array = [ [1,'a'], [2,'b'], [3,'c'] ];

到这样的事情:

Object { 1: "a", 2: "b", 3: "c" }

到目前为止,这是我想出的:

function objectify(array) {
    var object = {};
    array.forEach(function(element) {
        object[element[0]] = element[1];
    });
    return object;
}

效果很好,但看起来有点笨拙。有没有更好的办法?像reduce() 这样的东西会起作用吗?会更快吗?

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    使用Object.fromEntries,您可以将Array 转换为Object

    var array = [
      [1, 'a'],
      [2, 'b'],
      [3, 'c']
    ];
    var object = Object.fromEntries(array);
    console.log(object);

    【讨论】:

    • 这是“正确”的答案,比reduce 方法好得多。如果您需要针对非常旧的浏览器(例如 IE),请仅使用 reduce
    • 多么优雅的完成工作的方式。这段代码 sn-p 完成了这项工作,没有任何进一步的复杂性。
    【解决方案2】:

    你确实可以使用Array.prototype.reduce:

    function objectify(array) {
        return array.reduce(function(p, c) {
             p[c[0]] = c[1];
             return p;
        }, {});
    }
    

    其中p 是上一次迭代的结果,最初是{}c 是数组的当前元素。

    它不可能比array.forEach 快,但恕我直言,它更干净。我认为没有比这更简单的实现了。

    注意:Underscore 库中已经有一个函数可以做到这一点:_.object(array)

    【讨论】:

      【解决方案3】:

      使用现代语法的简洁版本:

      let objectify = a => a.reduce( (o,[k,v]) => (o[k]=v,o), {} );
      

      我将此技术用作简洁查询字符串解析器的一部分:

      // Converts "?foo=bar&j=1&go" into { foo:'bar', j:'1', go:true }
      function parseQueryString(qs) {
          var q = decodeURIComponent;
          return qs.replace(/^\?/,'').split('&').map(s => s.split('='))
                   .reduce((o,[k,v]) => (o[q(k)] = v?q(v):true, o), {});
      }
      

      【讨论】:

      • 这非常适合我的用例。我认为自己非常精通 ESXXXX,但我不太清楚 lambda 是如何工作的。特别是(o[k]=v,o) 部分。有什么见解吗?另外,感谢分享这个宝石。 :-)
      • @KyleFarris 它使用逗号运算符对地图执行分配,然后返回o 本身。
      【解决方案4】:

      Lodash 有一个 _.fromPairs 方法可以做到这一点。

      来自文档:
      _.fromPairs([['a', 1], ['b', 2]]); // => { 'a': 1, 'b': 2 }

      【讨论】:

        【解决方案5】:

        你可以把整个东西包裹在Array.prototype.reduce中,像这样

        function objectify(array) {
            return array.reduce(function(result, currentArray) {
                result[currentArray[0]] = currentArray[1];
                return result;
            }, {});
        }
        
        console.log(objectify([ [1, 'a'], [2, 'b'], [3, 'c'] ]));
        # { '1': 'a', '2': 'b', '3': 'c' }
        

        我们只是在result 对象中累积键值对,最后reduce 的结果将是result 对象,我们将其作为实际结果返回。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-11
          • 1970-01-01
          • 1970-01-01
          • 2021-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-07
          相关资源
          最近更新 更多