如何在JavaScript中将一个对象数组转换为映射对象?

5

如何将类似 initialArray 的JSON对象数组转换为 finalObject 的映射?

var initialArray = [
             { id:'id1', name:'name1' },
             { id:'id2', name:'name2' },
             { id:'id3', name:'name3' },
             { id:'id4', name:'name4' }
          ];

var finalObject = {
                  'id1':'name1',
                  'id2':'name2',
                  'id3':'name3',
                  'id4':'name4'
               }

需要考虑的事项:

有什么想法吗?


2
这些只是JavaScript对象,你的输入中没有JSON。 - Quentin
8个回答

3

你需要操作数组中的对象,而不是包含它们在数组中索引的字符串。

你还应该使用普通的for循环来遍历数组。

已修复的JSFiddle:

var x = [ {id:'1', img:'img1'}, {id:'2', img:'img2'}, {id:'3', img:'img3'} ];
var resp = {};

for( var i = 0 ; i < x.length ; i++ ){
    var obj = x[i];
    resp[obj.id] = obj.img;
}

document.write( JSON.stringify(resp, undefined, 2) );
​

2
你可以循环遍历数组,对于每个对象,向 finalObject 添加一个新属性,其属性名为id,值为name。

演示

var finalObject = {};

for (var i = 0, max = initialArray.length; i < max; i++)
    finalObject[initialArray[i].id] = initialArray[i].name;

1
var finalObject = initialArray.reduce(function(ret, obj){
  ret[obj.id] = obj.name;
  return ret;
}, {});

这个解决方案针对特定问题的属性名称,但是 Array.prototype.reduce 是我经常用于任何需要非数组结果的数组迭代的函数。


1

你没有正确使用 For In jsFiddle

var x = [ {id:'1', img:'img1'}, {id:'2', img:'img2'}, {id:'3', img:'img3'} ];
var resp = {};

for( var key in x ){
    resp['id' + x[key].id] = x[key].img;
}

document.write( JSON.stringify(resp, undefined, 2) );


只需要删除“id”+部分,这正是我所需要的。谢谢! - Sherzod
当我回答时,你的问题明确指出你想要 'id1':'name1',而且你的 initialArray = [ { id:'1', name:'name1' },所以需要在 'id' 前面添加。当我制作我的 jsFiddle 时,我没有改变你的初始数组 ;) - Sinetheta

1

resp[key.id] = key.img;

你正确地称之为key。但你需要一个值;

resp[x[key].id] = x[key].img;


0
for (var i=0; i<x.length; i++) {
    var id = 'id' + x[i].id;
    var img = x[i].img;
    resp[id] = img;
}

0

如果我理解正确,你可以做类似这样的事情

var x =' [ {"id":"1", "img":"img1"}, {"id":"2", "img":"img2"}, {"id":"3", "img":"img3"}]';
var resp = {};
var json = $.parseJSON(x);
$(json).each(function(i,v){        
    resp[v.id]=v.img;
});

 console.log( resp);

演示

你提到了JSON,但是在你提供的fiddle中没有JSON,甚至没有添加jQuery作为资源,所以我做了一些假设。


0
今天我也遇到了同样的问题,但是在这里没有找到答案,除了@adam-rackis的回答。
我找到的方法是:
var initialArray = [
    { id:'id1', name:'name1' },
    { id:'id2', name:'name2' },
    { id:'id3', name:'name3' },
    { id:'id4', name:'name4' }
],
    finalObject = {};

$.each(initialArray, function(k,v) {
    finalObject[v.name] = v.value;
});

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