фильтр массива в 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 68

6 ответов:

Вы можете использовать jQuery.grep():

var found_names = $.grep(names, function(v) {
    return v.name === "Joe" && v.age < 30;
});

DEMO: 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
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>