数组:将对象属性设为数组键

时间:2016-05-10 15:06:31

标签: javascript

我有一组像这样的对象:

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是否有一种简单有效的方法?

3 个答案:

答案 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);

您可能希望手动复制属性或执行原始对象的克隆副本,但我这里并没有完全简化我的示例。