数组:使对象属性成为数组键

Array: make object property into array key

本文关键字:数组 对象 属性      更新时间:2023-09-26

我有一个对象数组,如下所示:

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

有没有一种简单有效的方法来使用undercoreJS或普通JS?

我想,这就是你想要的。

这是jsbin链接。http://jsbin.com/soheni/edit?html,js,控制台,输出

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

输出:

{
   name1:{
           attribute1: "a1Value1",
           attribute2: "a2Value1"
         },
   name2: {
           attribute1: "a1Value2",
           attribute2: "a2Value2"
   }
}

如果你真的不关心结果中的name属性,那么快速而肮脏:

var obj = arr.reduce(function(p,c) {
    p[c.name] = c;
    return p;
},{});

如果确实希望删除name属性,则可以从cdelete它。然而,这将使原始值发生变化。如果希望原始数组仍保留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属性保留在那里,除非有一个真正令人信服的原因(即它确实会导致性能问题,或者如果它存在,其他代码会抱怨)来删除它

这里有一种方法…

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

您可能希望手动复制属性,或者对原始对象进行克隆复制,但我在这里并不是纯粹为了简化示例。