2017-06-22 59 views
0

嘿家伙这必须看起来重复,因为我已经质疑这已被回答,但这次它有点不同。过滤对象的数组,并通过使用值的数组来获得它的属性

前面的问题: My previous question which is already been answered

所以这是我的问题,我有对象(人)财产被称为“名”的数组,“角色”。我有另一个名为'Jobs'的数组。如果我使用代码示例,效果会更好。

var jobs = ['engineer','scientist','developer']; 
var people = [ {name:'John', role:'engineer'}, 
       {name:'Jane', role:'scientist'}, 
       {name:'Jonathan', role:'developer'}, 
       {name:'Jane', role:'engineer'} ]; 

正如你可以看到具有相同属性'名称'的对象可以看到,但具有不同的作用。我想根据他们的角色使用'jobs'数组将他们提取到一个新数组中。

例输出将是:重复“人”的阵列上

var peopleWithJobs = [ 
         {name:'John', jobs:['engineer'] } 
         {name:'Jane', jobs:['scientist', 'engineer'] }, 
         {name:'Jonathan', jobs:['developer'] } 
        ] 

如果“名”的属性值是拿到作用,推动/追加到作业的新阵列“peopleWithJobs”的属性。

我一直在使用地图和筛选更高阶的功能,但即时通讯相当新的JavaScript,只是不能把我的头围绕这个逻辑。

+1

我觉得做一个新的对象,使用人的名字为重点,以创建你的工作会更容易 –

回答

0

var jobs = ['engineer','scientist','developer']; 
 
var people = [ {name:'John', role:'engineer'}, 
 
       {name:'Jane', role:'scientist'}, 
 
       {name:'Jonathan', role:'developer'}, 
 
       {name:'Jane', role:'engineer'} ]; 
 
       
 
var peopleWithJobs = []; 
 

 
for(var x=0;x<people.length;x++) { 
 
    if(jobs.indexOf(people[x].role) != -1) { 
 
     var uniqueNames = peopleWithJobs.map(function(val) { 
 
     return val.name; 
 
     }); 
 
     if(uniqueNames.indexOf(people[x].name) == -1) 
 
     peopleWithJobs.push({name: people[x].name, jobs: [people[x].role]}); 
 
     else { 
 
     peopleWithJobs[uniqueNames.indexOf(people[x].name)].jobs.push(people[x].role); 
 
     } 
 
    } 
 
} 
 

 
console.log(peopleWithJobs);

+0

从没想过的indexOf方法,谢谢老兄我学到了一些东西,所以如果' - 1'它只是表示它不存在于阵列上吗? –

+0

是的。如果indexOf返回-1,那么它不存在于数组中。这是一个非常有用的功能。 –

0

当你第一次排序的数组,构建新的数组是非常简单的。在检查名称是否与以前的名称相同之后,您可以逐个将这些项目推送到新阵列,在这种情况下,您只会将角色推送给前一个人员。

var people = [ {name:'John', role:'engineer'}, 
 
       {name:'Jane', role:'scientist'}, 
 
       {name:'Jonathan', role:'developer'}, 
 
       {name:'Jane', role:'engineer'} ]; 
 
       
 
function reconstruct(arr) { 
 

 
    // Sort 
 
    var arr = arr.slice().sort(function(a,b) { 
 
    var x = a.name.toLowerCase(); 
 
    var y = b.name.toLowerCase(); 
 
    return x < y ? -1 : x > y ? 1 : 0; 
 
    }); 
 
    
 
\t // Construct new array 
 
    var newArr = []; 
 
    
 
\t for (i=0; i<arr.length; i++) { 
 
\t \t if (arr[i-1] && (arr[i].name == arr[i-1].name)) { 
 
\t \t \t newArr[newArr.length-1].role.push(arr[i].role) 
 
\t \t } else { 
 
\t \t \t newArr.push({name: arr[i].name, role: [arr[i].role]}); 
 
\t \t } 
 
\t } 
 
    
 
\t return newArr; 
 
} 
 

 
console.log(reconstruct(people));

相关问题