2017-02-18 40 views
1

我有一个JavaScript对象集团JavaScript对象的ID

我试图按ID这些对象,并产生地图名称的列表,其中的关键是id的,并且该值是名称。例如:

{1 : [John, Jane, Mike], 3: [Bob, Will]} 

与下面的代码,我得到:

{1: [John, Jane, Mike, Bob, Will], 3: [John, Jane, Mike, Bob, Will]} 

我怎样才能实现我想要的输出?任何帮助,将不胜感激。

var myObj = [{ 
 
    id: 1, 
 
    name: "John", 
 
    major: "accounting" 
 
    }, 
 
    { 
 
    id: 1, 
 
    name: "Jane", 
 
    major: "accounting" 
 
    }, { 
 
    id: 1, 
 
    name: "Mike", 
 
    major: "accounting" 
 
    }, { 
 
    id: 3, 
 
    name: "Bob", 
 
    major: "history" 
 
    }, { 
 
    id: 3, 
 
    name: "Will", 
 
    major: "history" 
 
    }] 
 

 

 

 
for (i in myObj) { 
 
    var obj = myObj[i]; 
 
    var id = obj.id; 
 
    var name = obj.name; 
 
    var newMap = {}; 
 
    var namesArray = []; 
 

 
    if (!(id in newMap)) { 
 
    namesArray.push(name); 
 
    newMap[id] = namesArray; 
 

 
    } else { 
 
    for (key in newMap) { 
 
     if (key == id) { 
 
     namesArray.push(name); 
 
     newMap[key] = namesArray; 
 
     } 
 
    } 
 
    } 
 
    console.log(newMap); 
 
}

+0

我试图创建一个片段给你。该数组并不是一个可行的解决方案,它不需要for(for myObj)。请修复代码和对象,以反映您的意见 – mplungjan

+0

谢谢大家的解决方案 –

回答

1

编辑自己的程序:

var myObj = [{ 
 
    id: 1, 
 
    name: "John", 
 
    major: "accounting" 
 
    }, 
 
    { 
 
    id: 1, 
 
    name: "Jane", 
 
    major: "accounting" 
 
    }, { 
 
    id: 1, 
 
    name: "Mike", 
 
    major: "accounting" 
 
    }, { 
 
    id: 3, 
 
    name: "Bob", 
 
    major: "history" 
 
    }, { 
 
    id: 3, 
 
    name: "Will", 
 
    major: "history" 
 
    }] 
 

 

 
    var newMap = {}; 
 
    var namesArray = []; 
 
     
 
for (i in myObj) { 
 
    var obj = myObj[i]; 
 
    var id = obj.id; 
 
    var name = obj.name; 
 

 
    if (!(id in newMap)) { 
 
    namesArray = []; 
 
    namesArray.push(name); 
 
    newMap[id] = namesArray; 
 

 
    } else { 
 
     namesArray = newMap[id]; 
 
     namesArray.push(name); 
 
     
 
    } 
 
    
 
} 
 
console.log(newMap);

+0

正是我在找什么,谢谢! –

+0

@ developer-x,请看看我的回答。 –

0

使用Array.prototype.reduce()

var myObj = [{id: 1, name: "John", major:"accounting"}, 
 
      {id: 1, name: "Jane", major:"accounting"}, 
 
      {id: 1, name: "Mike", major:"accounting"}, 
 
      {id: 3, name: "Bob", major:"history" }, 
 
      {id: 3, name: "Will", major:"history" }]; 
 

 
var result = myObj.reduce(function(acc, item) { 
 
    acc[item.id] = acc[item.id] || []; 
 
    acc[item.id].push(item.name); 
 
    return acc; 
 
}, {}); 
 

 
console.log(result);

0
var myObj = [{id: 1, name: "John", major:"accounting"}, 
      {id: 1, name: "Jane", major:"accounting"}, 
      {id: 1, name: "Mike", major:"accounting"}, 
      {id: 3, name: "Bob", major:"history"}, 
      {id: 3, name: "Will", major:"history"}]; 

var group = {}; 

for(var i = 0; i < myObj.length; i++){ 
    if(myObj[i].id in group){ 
    group[myObj[i].id].push(myObj[i].name); 
    } else { 
    group[myObj[i].id] = []; 
    group[myObj[i].id].push(myObj[i].name); 
    } 
} 
console.log(group); 
0

使用map功能的另一种解决方案。

var objs = [{id: 1, name: "John", major:"accounting"}, 
 
      {id: 1, name: "Jane", major:"accounting"}, 
 
      {id: 1, name: "Mike", major:"accounting"}, 
 
      {id: 3, name: "Bob", major:"history"}, 
 
      {id: 3, name: "Will", major:"history"}]; 
 

 
var namesForId = [], currentId = null, theObj = {}; 
 
objs.map((item) => { 
 
    if (item.id === currentId) { 
 
     namesForId.push(item.name); 
 
    } else { 
 
     currentId = item.id; 
 
     namesForId = [item.name]; 
 
     theObj[item.id] = namesForId; 
 
    }  
 
}) 
 
console.log(theObj);

0

使用Array#reduce但有点更紧凑的另一种方法。

const input = [{ id: 1, name: "John", major: "accounting" }, { id: 1, name: "Jane", major: "accounting" }, { id: 1, name: "Mike", major: "accounting" }, { id: 3, name: "Bob", major: "history" }, { id: 3, name: "Will", major: "history" } ]; 
 

 
console.log(input.reduce((m, e) => ((m[e.id] = m[e.id] || []).push(e.name), m), {}))