2015-11-20 2 views
2

у меня есть два массива переменных, в которых каждый элемент представляет собой объект, имеющий некоторые свойства, как это:извлечения элементов из массива, чьи элементы являются объектами в JavaScript

var employees = [{ 
       name: 'Jack', 
       empId: 0, 
       age: 25, 
       orgId: 1 
       }, { 
       name: 'Lucifer', 
       empId: 1, 
       age: 35, 
       orgId: 2 
       }, { 
       name: 'Adam', 
       empId: 3, 
       age: 46, 
       orgId: 1 
       }, { 
       name: 'Eve', 
       empId: 4, 
       age: 30, 
       orgId: 3 
       }]; 

и второй переменной является

var companies= [{ 
name: 'Microsoft', 
id: 1, 
employees: [5 , 9] 
}, { 
name: 'Google', 
id: 2, 
employees: [1] 
}, { 
name: 'LinkedIn', 
id: 3, 
employees: [10] 
}]; 

, так что теперь я хочу, чтобы, когда я даю название компании (например: Google), он возвращает данные сотрудника. Я хочу сделать это с помощью метода filter()/reduce(), но я не могу этого сделать. Помощь необходимо .. спасибо

ответ

1

Если работник orgId такого же, как компании id вы может использовать filter; один, чтобы получить id, а затем еще один, чтобы захватить сотрудников, связанных с этим идентификатором. Функция возвращает массив сотрудников.

function getEmployees(company) { 
    var id = companies.filter(function (el) { 
     return el.name === company; 
    })[0].id; 
    return employee.filter(function (el) { 
     return el.orgId === id; 
    }); 
} 

getEmployees('Microsoft'); 

ВЫВОД

[ 
    { 
    "name": "Jack", 
    "empId": 0, 
    "age": 25, 
    "orgId": 1 
    }, 
    { 
    "name": "Adam", 
    "empId": 3, 
    "age": 46, 
    "orgId": 1 
    } 
] 

DEMO

+1

Это хороший ответ с хорошей демонстрацией использования метода фильтра – lKashef

+0

@ Энди, пожалуйста, скажите мне, почему вы дали [0] .id в первом фильтре? – amark

+0

'filter' возвращает массив. Поскольку этот фильтр возвращает только один элемент, соответствующий названию компании, мы захватываем первый элемент '[0]', который является объектом, а затем '.id', чтобы получить идентификатор, который мы используем во втором фильтре. @amark – Andy

1

Вы можете сделать это с помощью forEach цикла и проверки имени:

var Employees = []; //initialize 
companies.forEach(function(company) { 
    if (company.name == "Microsoft"){ 
     Employees = company.employees; 
     //whatever you like 
     Employees.forEach(function(id){ 
       alert(id); 
     }); 

    } 
}); 

Рабочей JsFiddle: https://jsfiddle.net/sapyt777/

+0

Будьте осторожны с методом '.forEach()' и его совместимостью с IE8 и более старыми браузерами. –

+0

@ MarcosPérezGude хороший момент, но позволяет надеяться, что большинство людей больше не используют ie8;) –

+0

Желаю, чтобы Бог вас услышал. И IE9/IE10 мы должны убить их тоже. Да здравствует стандарты. –

0

Попытка кисти вверх свои навыки. Поэтому я уверен, что это работает, но я не знаю, хороший ли это способ достичь того, чего вы хотите!

var input = "Microsoft"; 

for(company in companies) { 
    if(companies[company].name === input) { 
     for(emp in employee) { 
      if(companies[company].id === employee[emp].orgId) 
      { 
       console.log(employee[emp]); 
      } 
     } 
    } 
} 
+0

Пожалуйста, не меняйте имена переменных в вопросе, если ответы, ссылающиеся на эту переменную, уже отправлены. Это нарушает код в этих ответах. – Andy

+0

Это просто здравый смысл, но вы правы! .. Спасибо за совет, я обновил свой ответ, но не уверен, могу ли я отменить мои ожидающие редактирования! – lKashef

+0

Не волнуйся - у меня была такая же мысль. – Andy

Смежные вопросы