将数组转换为关联数组的函数

8

3
你的意思是将它转换为对象吗?你想让数组成员成为键还是值? - James M
是的,我确实希望它们作为键值对。 - Murtaza Khursheed Hussain
1
@DavidRodrigues 但是基于0,而不是基于1! - James M
1
实际上,我想将上述数组转换为 var a = ['a':'b', 'c':'d']; - Murtaza Khursheed Hussain
1
请在您的问题中添加这些细节! - epascarello
显示剩余3条评论
3个回答

16

使用.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
1
@gintas:仅在支持ES5的那些地方可以使用。但你可以很容易地提供自己的实现。 - Felix Kling
哦,太好了。但是你为什么要做JSON.stringify(obj_a)呢? - Murtaza Khursheed Hussain
@gintas "所有现代浏览器,但不包括IE。" 引用来源 - Rob W
@ROB W如果您能够以纯JavaScript提供确切的实现,请回复。 - Murtaza Khursheed Hussain
@MurtazaHussain 在我提供的源代码中,已经提供了备选方案:请参见 MDN:.forEach #Compatibility。我使用 JSON.stringify 作为一种快速检查对象是否包含所需名称-键对的方法。 - Rob W

6

请尝试以下操作:

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

1
由于您已经按2步长跳跃,因此“a.length”就足够了。 - pimvdb
@pimvdb 这样做是不正确的 - 考虑长度为1的数组... - Rich O'Kelly
@rich.okelly 那样的话,结果应该是 {'a': undefined},这样比忘记键值要好。 - Rob W
我要警告大家,不要使用像 if (obj["foo"])... 或者 if ("foo" in obj)... 这样的存在性检查,因为这些检查也会检测到在 obj 的原型上找到的字段(以 if ("toString" in obj)... 作为例子)。为了保险起见,请使用 obj.hasOwnProperty("foo") - 这可以确保不会检查原型。 - Alexander Pavlov
但是,将具有奇数元素数量的数组转换为这样的对象并没有太多意义,因为在这种情况下没有清晰的成对元素。 - pimvdb

2

没有关联数组这样的东西,它们被称为对象但基本上做的是相同的事情 :-)

以下是如何进行转换的方法

 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;
     }
 }

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