2014-11-20 3 views
2

У меня есть два массива объектов, и я хочу отфильтровать первый в соответствии с тем, что на втором. Вот пример:Проверьте, есть ли у объекта ключ в javascript

var ary1 = [{id: 23, title: 'blabla'},{id:43, title: 'bleble'}, {id:54, title:'blibli'}]; 
var ary2 = [{id:23},{id:54}, {id:65}]; 

Так что в данном случае то, что я хочу, чтобы вернуть массив с объектами, которые имеют идентификаторы 23 и 54 первого массива, со всеми возможными свойствами (в данном случае, название).

Не могли бы вы дать мне какой-нибудь намек, который мог бы мне помочь?

+0

Пожалуйста, поделитесь своим мнением о том, что вы пробовали. –

ответ

2

Это может вам помочь.

  1. Loop через ary2, наращивая массив каждого id значения (давайте назовем этот массив existingIds).

  2. После этого цикла, теперь петля через ary1. Для каждого элемента в ary1 проверьте, существует ли значение id в массиве existingIds, который мы только что создали. Если это так, добавьте текущий элемент в массив result.

Я мог бы написать код для вас, но это будет лучше опыт обучения, если вы первый попробовать это сами :)

1

попробовать это:

var ary1 = [{id: 23, title: 'blabla'},{id:43, title: 'bleble'}, {id:54, title:'blibli'}]; 
var ary2 = [{id:23},{id:54}, {id:65}]; 
var newary=[]; 

for(x in ary1){ 
    for(y in ary2){ 
     if(ary1[x].id == ary2[y].id){ 
      newary.push(ary1[x]); 
     } 
    } 
} 

console.log(newary);// here newary will be your return newary; 
1

Мог бы также использовать некоторого функционального программирования, встроенного в javascript.

filteredResults = ary1.filter(function(ele){ 
    return (ary2.map(function(idobj){return idobj.id;}).indexOf(ele.id)>-1) 
}) 

filter(function) будет перебирать каждый элемент массива, пропуская его через функцию обратного вызова. Изнутри этого обратного вызова, если возвращается истина, это значение сохраняется. Если false, это значение отфильтровывается.

Также map(function) будет проходить через каждый элемент массива, передавая также значение обратного вызова. Все значения, возвращаемые из обратного вызова карты, будут введены в результат. Поэтому мы можем взять id из каждого элемента в ary2 и вернуть его в функцию map.

var ary1 = [{id: 23, title: 'blabla'},{id:43, title: 'bleble'}, {id:54, title:'blibli'}]; 
 
var ary2 = [{id:23},{id:54}, {id:65}]; 
 
//Filter for the available ID's, store the resulting objects in a new array 
 
filteredResults = ary1.filter(function(ele){ 
 
    //map creates an array of just ID's 
 
    return (ary2.map(function(idobj){return idobj.id;}).indexOf(ele.id)>-1) 
 
}) 
 

 
//now do whatever you were planning on doing with your results/ 
 
var res = document.getElementById("results"); 
 
filteredResults.forEach(function(ele){ 
 
    res.innerHTML+="<li>{id:"+ele.id + ",title:" +ele.title+"}</li>" 
 
}) 
 
console.log(filteredResults);
<ul id="results"></ul>

3

Получить список индексов, который вы хотите произвести поиск по использованию map:

var indexes = ary2.map(function (el) { 
    return el.id; 
}); 

filter результаты, основанные на списке индексов:

var result = ary1.filter(function (el) { 
    return indexes.indexOf(el.id) > -1; 
}); 

DEMO

+1

Почему это происходит, а мой ответ - нет? Я сделал то же самое в своем ответе за 8 минут до этого ответа? –

+1

@ArtyMcFly Я предполагаю, что простота и краткость делают здесь разницу ... –

+1

Возможно, это связано с тем, что вы комбинировали «карту» в «фильтре», а не как две различные операции, что упрощает (на мой взгляд) понимание , – Andy

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