【问题标题】:Function to convert an Array to an Associative array [duplicate]将数组转换为关联数组的函数[重复]
【发布时间】:2012-03-16 23:06:07
【问题描述】:

可能重复:
Convert flat array [k1,v1,k2,v2] to object {k1:v1,k2:v2} in JavaScript?

我想在 JavaScript 中将数组转换为关联数组。

例如,给定以下输入,

  var a = ['a', 'b', 'c', 'd'];

我想得到下一个关联数组作为输出:

  {'a' : 'b', 'c' : 'd'}

我该怎么做?

【问题讨论】:

  • 你的意思是一个对象?您希望数组成员成为键还是值?
  • 嗯...这是一个关联数组,但使用数字之类的键。类似于:{1: 'a', 2: 'b', 3: 'c', 4: 'd'}
  • @DavidRodrigues 但是基于 0,而不是基于 1!
  • 其实我想把上面的数组转换成 var a = ['a':'b', 'c':'d'];
  • 用这些细节编辑你的问题!

标签: javascript arrays associative-array


【解决方案1】:

没有关联数组之类的东西,它们被称为Objects,但功能几乎相同:-)

以下是您将如何进行转换

 var obj = {}; // "associative array" or Object
 var a = ['a', 'b', 'c', 'd'];
 for(index in a) {
     if (index % 2 == 0) {
         var key = a[index];
         var val = a[index+1];
         obj[key] = val;
     }
 }

【讨论】:

    【解决方案2】:

    尝试以下方法:

    var obj = {};
    for (var i = 0, length = a.length; i < length; i += 2) {
      obj[a[i]] = a[i+1];
    }
    

    【讨论】:

    • a.length 就足够了,因为无论如何您都在以 2 步进行跳跃。
    • @pimvdb 这样做是不正确的 - 考虑一个长度为 1 的数组...
    • @rich.okelly 那就是{'a': undefined},这可能比忘记钥匙要好。
    • 我会警告不要像if (obj["foo"])... 甚至if ("foo" in obj)... 这样的存在检查,因为这些也会检测在obj 的原型上找到的字段(以if ("toString" in obj)... 为例)。为了安全起见,请使用obj.hasOwnProperty("foo") - 这保证不会检查原型。
    • 但话说回来,将具有奇数个元素的数组转换为这样的对象并没有什么意义,因为在这种情况下没有明确的对。
    【解决方案3】:

    使用.forEach

    var a = ['a', 'b', 'c', 'd'];
    var obj_a = {};
    a.forEach(function(val, i) {
        if (i % 2 === 1) return; // Skip all even elements (= odd indexes)
        obj_a[val] = a[i + 1];   // Assign the next element as a value of the object,
                                 // using the current value as key
    });
    // Test output:
    JSON.stringify(obj_a);       // {"a":"b","c":"d"}
    

    【讨论】:

    • 很好,我不知道array.forEach()。它适用于所有浏览器吗?
    • @gintas:只在那些支持 ES5 的人中。但是您可以轻松地提供自己的实现。
    • 哦,太好了。但是你在做 JSON.stringify(obj_a); ?
    • @gintas "除了 IE 之外的所有现代浏览器。" citation
    • @ROB W 如果你能在纯 javascript 中给出确切的实现..
    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2019-01-06
    • 2012-05-17
    • 2017-01-10
    • 2011-05-08
    相关资源
    最近更新 更多