У меня есть массив объектов, и мне интересно, как лучше его искать. Учитывая приведенный ниже пример, как я могу искать 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);
javascript
jquery
arrays
user441521
источник
источник
Ответы:
Вы можете использовать
jQuery.grep()
:var found_names = $.grep(names, function(v) { return v.name === "Joe" && v.age < 30; });
ДЕМО: http://jsfiddle.net/ejPV4/
источник
Вы можете сделать это очень легко с помощью
[].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 console.log(JSON.stringify(filteredValue));
Вы можете просто использовать javascript :)
источник
Для тех, кто хочет фильтровать массив объектов с помощью любого ключа:
function filterItems(items, searchVal) { return items.filter((item) => Object.values(item).includes(searchVal)); } let data = [ { "name": "apple", "type": "fruit", "id": 123234 }, { "name": "cat", "type": "animal", "id": 98989 }, { "name": "something", "type": "other", "id": 656565 }] console.log("Filtered by name: ", filterItems(data, "apple")); console.log("Filtered by type: ", filterItems(data, "animal")); console.log("Filtered by id: ", filterItems(data, 656565));
фильтр из массива объектов JSON: **
источник
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>
источник
Так что быстрый вопрос. Что, если у вас есть два массива объектов, и вы хотите «выровнять» эти массивы объектов, чтобы можно было убедиться, что объекты каждого массива расположены в том же порядке, что и другие массивы? Что делать, если вы не знаете, какие ключи и значения содержит какой-либо из объектов внутри массивов ... Тем более, в каком они порядке?
Так что вам нужно «WildCard Expression» для своего
[].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, который у меня почти завершен, который делает это, равенство объектов с исключениями, объединение объектов и уплотнение массивов. Если это то, что вам нужно или вы хотите для своего проекта, прокомментируйте, и я сделаю библиотеку доступной раньше, чем позже.
Надеюсь это поможет! Удачного кодирования :)
источник
Самым простым и читаемым подходом будет использование собственного метода фильтрации javascript.
Встроенный фильтр javaScript использует декларативный подход к фильтрации элементов массива. Поскольку это метод, определенный в Array.prototype, он выполняет итерацию по предоставленному массиву и вызывает для него обратный вызов. Этот обратный вызов, который действует как наша функция фильтрации, принимает три параметра:
element
- текущий элемент в повторяемом массивеindex
- индекс или расположение текущего элемента в массиве, по которому выполняется итерацияarray
- исходный массив, к которому был применен метод фильтрации. Давайте воспользуемся этим методом фильтрации в примере. Обратите внимание, что фильтр можно применить к любому типу массива. В этом примере мы собираемся фильтровать массив объектов на основе свойства объекта.Пример фильтрации массива объектов на основе свойств объекта может выглядеть примерно так:
// Please do not hate me for bashing on pizza and burgers. // and FYI, I totally made up the healthMetric param :) let foods = [ { type: "pizza", healthMetric: 25 }, { type: "burger", healthMetric: 10 }, { type: "salad", healthMetric: 60 }, { type: "apple", healthMetric: 82 } ]; let isHealthy = food => food.healthMetric >= 50; const result = foods.filter(isHealthy); console.log(result.map(food => food.type)); // Result: ['salad', 'apple']
Чтобы узнать больше о фильтрации массивов в функциях и создать свою собственную фильтрацию, ознакомьтесь с этой статьей: https://medium.com/better-programming/build-your-own-filter-e88ba0dcbfae
источник