фильтр массива в JavaScript объекты
у меня есть массив объектов, и мне интересно, лучший способ искать его. Учитывая приведенный ниже пример, как я могу искать name = "Joe"
и age < 30
? Есть ли что-нибудь, с чем может помочь jQuery, или мне самому нужно перебить этот поиск?
var names = new Array();
var object = { name : "Joe", age:20, email: "joe@hotmail.com"};
names.push(object);
object = { name : "Mike", age:50, email: "mike@hotmail.com"};
names.push(object);
object = { name : "Joe", age:45, email: "mike@hotmail.com"};
names.push(object);
6 ответов:
Вы можете использовать
jQuery.grep()
:var found_names = $.grep(names, function(v) { return v.name === "Joe" && v.age < 30; });
вы можете сделать это очень легко с
[].filter
способ:var filterednames = names.filter(function(obj) { return (obj.name === "Joe") && (obj.age < 30); });
вам нужно добавить прокладку для браузеров, которые не поддерживают
[].filter
способ: эта страница MDN дает такой код.
вы могли бы использовать jQuery.filter () функция для возврата элементов из подмножества соответствующих элементов.
var names = [ { name : "Joe", age:20, email: "joe@hotmail.com"}, { name : "Mike", age:50, email: "mike@hotmail.com"}, { name : "Joe", age:45, email: "mike@hotmail.com"} ]; var filteredNames = $(names).filter(function( idx ) { return names[idx].name === "Joe" && names[idx].age < 30; }); $(filteredNames).each(function(){ $('#output').append(this.name); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="output"/>
var nameList = [ {name:'x', age:20, email:'x@email.com'}, {name:'y', age:60, email:'y@email.com'}, {name:'Joe', age:22, email:'joe@email.com'}, {name:'Abc', age:40, email:'abc@email.com'} ]; var filteredValue = nameList.filter(function (item) { return item.name == "Joe" && item.age < 30; }); //To See Output Result as Array alert(JSON.stringify(filteredValue));
вы можете просто использовать JavaScript :)
так быстро вопрос. Что делать, если у вас есть два массива объектов, и вы хотели бы "выровнять" эти массивы объектов, чтобы вы могли убедиться, что объекты каждого массива находятся в том же порядке, что и другие массивы? Что делать, если вы не знаете, какие ключи и значения содержит любой из объектов внутри массивов... Тем более в каком они вообще порядке?
поэтому вам нужно "Подстановочное выражение" для вашего
[].filter
,[].map
и т. д. Как вы получаете выражение дикой карты?var jux = (function(){ 'use strict'; function wildExp(obj){ var keysCrude = Object.keys(obj), keysA = ('a["' + keysCrude.join('"], a["') + '"]').split(', '), keysB = ('b["' + keysCrude.join('"], b["') + '"]').split(', '), keys = [].concat(keysA, keysB) .sort(function(a, b){ return a.substring(1, a.length) > b.substring(1, b.length); }); var exp = keys.join('').split(']b').join('] > b').split(']a').join('] || a'); return exp; } return { sort: wildExp }; })(); var sortKeys = { k: 'v', key: 'val', n: 'p', name: 'param' }; var objArray = [ { k: 'z', key: 'g', n: 'a', name: 'b' }, { k: 'y', key: 'h', n: 'b', name: 't' }, { k: 'x', key: 'o', n: 'a', name: 'c' } ]; var exp = jux.sort(sortKeys); console.log('@juxSort Expression:', exp); console.log('@juxSort:', objArray.sort(function(a, b){ return eval(exp); }));
вы можете также используйте эту функцию на итерации для каждого объекта, чтобы создать лучшее коллективное выражение для всех ключей в каждом из ваших объектов, а затем отфильтровать массив таким образом.
Это небольшой фрагмент из API Juxtapose, который у меня почти завершен, что делает это, равенство объектов с исключениями, единство объектов и конденсация массива. Если это то, что вам нужно или нужно для вашего проекта, пожалуйста, прокомментируйте, и я сделаю lib доступным раньше, чем позже.
надеюсь, что это помогает! Счастливое кодирование:)
var names = [{ name: "Joe", age: 20, email: "joe@hotmail.com" }, { name: "Mike", age: 50, email: "mike@hotmail.com" }, { name: "Joe", age: 45, email: "mike@hotmail.com" } ]; const res = _.filter(names, (name) => { return name.name == "Joe" && name.age < 30; }); console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>