tablica filtrów javascript obiektów

87

Mam tablicę obiektów i zastanawiam się, jak najlepiej ją przeszukać. Biorąc pod uwagę poniższy przykład, jak mogę wyszukiwać name = "Joe"i age < 30? Czy jest coś, w czym jQuery może pomóc, czy też muszę samemu brutalnie wymusić to wyszukiwanie?

var names = new Array();

var object = { name : "Joe", age:20, email: "[email protected]"};
names.push(object);

object = { name : "Mike", age:50, email: "[email protected]"};
names.push(object);

object = { name : "Joe", age:45, email: "[email protected]"};
names.push(object);
user441521
źródło
Przez wyszukiwanie masz na myśli filtr?
joragupra
szukaj! = filtr. Które chcesz?
TJ Crowder

Odpowiedzi:

78

Możesz to zrobić bardzo łatwo za pomocą [].filtermetody:

var filterednames = names.filter(function(obj) {
    return (obj.name === "Joe") && (obj.age < 30);
});

Będziesz musiał dodać podkładkę dla przeglądarek, które nie obsługują tej [].filtermetody: ta strona MDN zawiera taki kod.

samotny dzień
źródło
Proponuję rzucić okiem na polyfill na połączonej stronie MDN, żeby trochę się zabawić, czytając kod i być może nauczysz się czegoś nowego.
Aurelio
10

Możesz użyć funkcji jQuery.filter (), aby zwrócić elementy z podzbioru pasujących elementów.

var names = [
    { name : "Joe", age:20, email: "[email protected]"},
    { name : "Mike", age:50, email: "[email protected]"},
    { name : "Joe", age:45, email: "[email protected]"}
   ];
   
   
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"/>

Vadim Gremyachev
źródło
9

var nameList = [
{name:'x', age:20, email:'[email protected]'},
{name:'y', age:60, email:'[email protected]'},
{name:'Joe', age:22, email:'[email protected]'},
{name:'Abc', age:40, email:'[email protected]'}
];

var filteredValue = nameList.filter(function (item) {
      return item.name == "Joe" && item.age < 30;
});

//To See Output Result as Array
console.log(JSON.stringify(filteredValue));

Możesz po prostu użyć javascript :)

Fakhrul Hasan
źródło
4

Dla tych, którzy chcą odfiltrować z tablicy obiektów za pomocą dowolnego klucza:

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));

filtruj z tablicy obiektów JSON: **

Arun Saini
źródło
2

var names = [{
        name: "Joe",
        age: 20,
        email: "[email protected]"
    },
    {
        name: "Mike",
        age: 50,
        email: "[email protected]"
    },
    {
        name: "Joe",
        age: 45,
        email: "[email protected]"
    }
];
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>

Parth Raval
źródło
1

Więc szybkie pytanie. A co, jeśli masz dwie tablice obiektów i chciałbyś „wyrównać” te tablice obiektów, aby mieć pewność, że obiekty każdej tablicy są w takiej kolejności, jak w drugiej tablicy? A co, jeśli nie wiesz, jakie klucze i wartości zawiera którykolwiek z obiektów wewnątrz tablic ... A tym bardziej w jakiej kolejności się one znajdują?

Tak trzeba „wieloznacznych wyrażenie” Dla własnego [].filter, [].mapitp Jak uzyskać wyrażenie dziką kartę?

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);
}));

Możesz również użyć tej funkcji w iteracji dla każdego obiektu, aby utworzyć lepsze wyrażenie zbiorcze dla wszystkich kluczy w każdym z twoich obiektów, a następnie w ten sposób przefiltrować tablicę.

To jest mały fragment z API Juxtapose, który mam prawie gotowy, który robi to, równość obiektów z wyjątkami, jedności obiektów i kondensację tablic. Jeśli są to rzeczy, których potrzebujesz lub chcesz do swojego projektu, skomentuj, a udostępnię bibliotekę wcześniej niż później.

Mam nadzieję że to pomoże! Miłego kodowania :)

Cody
źródło
1

Najbardziej prostym i czytelnym podejściem będzie użycie natywnej metody filtru javascript.

Natywny filtr javaScript przyjmuje deklaratywne podejście do filtrowania elementów tablicy. Ponieważ jest to metoda zdefiniowana w Array.prototype, wykonuje iterację na podanej tablicy i wywołuje na niej wywołanie zwrotne. To wywołanie zwrotne, które działa jako nasza funkcja filtrująca, przyjmuje trzy parametry:

element - bieżący element w tablicy podlegającej iteracji

index - indeks lub położenie bieżącego elementu w tablicy, po której jest iterowana

array- oryginalna tablica, na której zastosowano metodę filtru. Użyjmy tej metody filtru w przykładzie. Zwróć uwagę, że filtr można zastosować do dowolnej tablicy. W tym przykładzie będziemy filtrować tablicę obiektów na podstawie właściwości obiektu.

Przykład filtrowania tablicy obiektów na podstawie właściwości obiektu mógłby wyglądać mniej więcej tak:

// 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']

Aby dowiedzieć się więcej o filtrowaniu tablic w funkcjach i tworzeniu własnego filtrowania, zapoznaj się z tym artykułem: https://medium.com/better-programming/build-your-own-filter-e88ba0dcbfae

Kasra Khosravi
źródło