2016-10-26 2 views
1

Итак, у меня есть отфильтрованные идентификаторы в одном массиве и имеющие все данные в другом массиве объектов. Я хочу отображать значения фильтрованных идентификаторов, упомянутые в массиве значений.Как фильтровать массив объектов по значениям в javascript?

var allData = [ 
    { 
     id:'10', 
     name:'jhon' 
    }, 
    { 
     id:'11', 
     name:'lewis' 
    }, 
    { 
     id:'12', 
     name:'taylor' 
    }, 
    { 
     id:'13', 
     name:'adam' 
    }, 
    { 
     id:'14', 
     name:'bolive' 
    } 
]; 

var addedIds = ['10', '12', '14']; 

Мой код Javascript,

allData.filter(data, function (item) { 
    item.map(function(list, i) { 
     if (list.id.indexOf(addedIds[i]) === -1) { 
      return; 
     } 
     console.log(list); 
    }); 
}); 
+0

что вы думаете, это 'addedIds [я]' делает, и почему вы думаете, 'i' является релевантным индекс в этом контексте? – njzk2

+0

Чтобы уточнить, хотите ли вы выводить имя каждого идентификатора, указанного в 'addIds'? – DaniP

+0

мой результат должен быть таким, [{id: "10", name: 'jhon'}, {id: "12", name: 'taylor'}, {id: "14", name: 'bolive'} ] – Sathya

ответ

4

var allData = [ 
 
    { 
 
     id:'10', 
 
     name:'jhon' 
 
    }, 
 
    { 
 
     id:'11', 
 
     name:'lewis' 
 
    }, 
 
    { 
 
     id:'12', 
 
     name:'taylor' 
 
    }, 
 
    { 
 
     id:'13', 
 
     name:'adam' 
 
    }, 
 
    { 
 
     id:'14', 
 
     name:'bolive' 
 
    } 
 
]; 
 

 
var addedIds = ['10', '12', '14']; 
 

 
var allData = allData.filter(function (item) { 
 
    if (addedIds.indexOf(item.id) !== -1) return item; 
 
}); 
 

 
console.log(allData);

+0

Также, как я могу добиться поиска фильтра по ключам? Поиск может быть фильтром по идентификатору ключа или имени ключа. – Sathya

+0

Да, это возможно. В этом случае только indexOf требует массив, а не массив объектов. –

+0

Это правильно? var allData = allData.filter (function (item) { if ($ ('input'). val(). indexOf (item.id)! == -1 || $ ('input'). val(). indexOf (item. name)! == -1) return item; }); – Sathya

7

Как насчет этого?

Array.prototype.filter ожидает только один параметр: функция, передаваемая каждому элементу в массиве и возвращающая значение true или false в зависимости от того, должен ли этот элемент быть включен в фильтр или нет.

Вы можете использовать Array.prototype.indexOf, чтобы узнать, есть ли строка в массиве.

var allData = [{ 
 
    id: '10', 
 
    name: 'jhon' 
 
}, { 
 
    id: '11', 
 
    name: 'lewis' 
 
}, { 
 
    id: '12', 
 
    name: 'taylor' 
 
}, { 
 
    id: '13', 
 
    name: 'adam' 
 
}, { 
 
    id: '14', 
 
    name: 'bolive' 
 
}]; 
 

 
var addedIds = ['10', '12', '14']; 
 

 
var filteredData = allData.filter(function(item) { 
 
    return addedIds.indexOf(item.id) != -1; 
 
}); 
 

 
console.log(filteredData);

1

var allData = [{ 
 
    id: '10', 
 
    name: 'jhon' 
 
}, { 
 
    id: '11', 
 
    name: 'lewis' 
 
}, { 
 
    id: '12', 
 
    name: 'taylor' 
 
}, { 
 
    id: '13', 
 
    name: 'adam' 
 
}, { 
 
    id: '14', 
 
    name: 'bolive' 
 
}]; 
 

 
var addedIds = ['10', '12', '14']; 
 
var addedIdsSet = new Set(addedIds); 
 
var result = allData.filter(e => addedIdsSet.has(e.id)); 
 
console.log(result)

Я лично, как превращение массивов ИДС в Набор и перемещение оттуда:

var addedIdsSet = new Set(addedIds); 

Тогда остальное дело фильтрации (как вы пытались) с помощью набора:

console.log(allData.filter(x => addedIdsSet.has(x.id))) 

Примечание: Использование набора только действительно необходимо если у вас есть большой список идентификаторов и вы хотите выжать некоторую производительность, так как это снизит сложность от O (n^2) до O (n), где n - это количество элементов во всехData. Несмотря ни на что, мне нравится использовать Set так или иначе, потому что код заканчивается тем, что выглядит более чистым!

1
var allData = [ 
{ 
    id:'10', 
    name:'jhon' 
}, 
{ 
    id:'11', 
    name:'lewis' 
}, 
{ 
    id:'12', 
    name:'taylor' 
}, 
{ 
    id:'13', 
    name:'adam' 
}, 
{ 
    id:'14', 
    name:'bolive' 
} 
]; 

var addedIds = ['10', '12', '14']; 

var filteredValues = allData.filter(x => addedIds.indexOf(x.id) !== -1); 
console.log(filteredValues); 
0

Вы можете сделать это следующим образом:

var allData = [ 
 
    { 
 
     id:'10', 
 
     name:'jhon' 
 
    }, 
 
    { 
 
     id:'11', 
 
     name:'lewis' 
 
    }, 
 
    { 
 
     id:'12', 
 
     name:'taylor' 
 
    }, 
 
    { 
 
     id:'13', 
 
     name:'adam' 
 
    }, 
 
    { 
 
     id:'14', 
 
     name:'bolive' 
 
    } 
 
]; 
 

 
var addedIds = ['10', '12', '14']; 
 

 
var filtered_results = []; 
 

 
allData.filter(function (item) { 
 
    for(var k in addedIds){ 
 
     if(item.id === addedIds[k]){ 
 
      filtered_results.push(item); 
 
     } 
 
    } 
 
}); 
 
console.log(filtered_results);

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