我有一组像这样的对象:
arr[0] = {name: 'name1', attribute1: 'a1Value1', attribute2: 'a2Value1'}
arr[1] = {name: 'name2', attribute1: 'a1Value2', attribute2: 'a2Value2'}
我想要实现的是创建第二个数组,其name属性为数组键,所以它看起来像这样:
arr2[name1] = {attribute1: 'a1Value1', attribute2: 'a2Value1'}
arr2[name2] = {attribute1: 'a1Value2', attribute2: 'a2Value2'}
使用underscoreJS或普通JS是否有一种简单有效的方法?
答案 0 :(得分:1)
我想,这就是你想要的。
这是jsbin链接。 http://jsbin.com/soheni/edit?html,js,console,output
root 16705 0.0 0.0 133312 1960 ? ssl 11:00 0:02 redis-server
输出:
var arry = [{name: 'name1', attribute1: 'a1Value1', attribute2: 'a2Value1'}, {name: 'name2', attribute1: 'a1Value2', attribute2: 'a2Value2'}];
function convert(arry){
var data = {};
arry.forEach(function(obj){
var nameKey = obj.name;
delete obj.name;
data[nameKey] = obj;
});
return data;
}
console.log(convert(arry));
答案 1 :(得分:1)
如果你真的不关心结果中的name
属性,那么又快又脏:
var obj = arr.reduce(function(p,c) {
p[c.name] = c;
return p;
},{});
如果您确实要删除name
媒体资源,则可以delete
c
name
。但是,这会改变原始值。如果您希望原始数组仍具有name
属性,则需要复制该对象(但不包含var obj = arr.reduce(function(p,c) {
p[c.name] = c;
delete c.name; // note this removes it from the original array too!
return p;
},{});
属性)。
所以你可以这样做:
var obj = arr.reduce(function(p,c) {
var cheapCopy = JSON.parse(JSON.stringify(c)); // note this is not necessarily the most
// efficient way to clone an object
delete cheapCopy.name;
p[c.name] = cheapCopy;
return p;
},{});
或者:
name
就个人而言,我倾向于将{{1}}属性留在那里,除非有一个非常令人信服的理由(即它实际上导致性能问题或其他一些代码会抱怨,如果存在的话)去全部删除它的麻烦。
答案 2 :(得分:1)
这是一种做法......
var arr = [];
arr.length = 3;
arr[0] = { name: 'name1', attribute1: 'a1Value1', attribute2: 'a2Value1' };
arr[1] = { name: 'name2', attribute1: 'a1Value2', attribute2: 'a2Value2' };
arr[2] = { name: 'name3', attribute1: 'a1Value3', attribute2: 'a2Value3' };
var newObj = {};
for (var i = 0; i < arr.length; i++) {
var arrObj = arr[i];
var propName = arrObj.name;
delete arrObj.name;
newObj[propName] = arrObj;
}
console.log('New Object:', newObj);
for (var key in newObj) {
console.log('New Object By Key/Value:', key, newObj[key]);
}
或者,更短......
var newObj = {};
arr.forEach(function(obj) {
var propName = obj.name;
delete obj.name;
newObj[propName] = obj;
});
console.log('newObj:', newObj);
您可能希望手动复制属性或执行原始对象的克隆副本,但我这里并没有完全简化我的示例。