2015-01-25 4 views
4

Интересно, есть ли более элегантный способ сделать это. Предположим, у меня есть массив объектов, как это:Javascript: фильтр массив объектов по массиву строк

a = [ 
    { 
    "id": "kpi02", 
    "value": 10 
    }, 
    { 
    "id": "kpi02", 
    "value": 30 
    }, 
    { 
    "id": "kpi02", 
    "value": 11 
    }, 
    { 
    "id": "kpi02", 
    "value": 33 
    }, 
    { 
    "id": "kpi03", 
    "value": 1 
    }, 
    { 
    "id": "kpi03", 
    "value": 0.5 
    }, 
    { 
    "id": "kpi04", 
    "value": 0.5 
    } 
] 

Теперь я хочу, чтобы фильтровать по id собственности, чтобы вернуть все объекты с матча в другом массиве

var kpis = ["kpi03", "kpi02"]; 

я пришел с этим решением :

var b = []; 
for (j in kpis) { 
for (i in a) { 
    if (a[i].id == kpis[j]) { 
    b.push(a[i]); 
    } 
} 
} 

Исходя из R, это кажется немного сложным, есть ли способ сделать это с filter прототипа? Как это, но с массивом строк для сравнения вместо одной строки:

var b = a.filter(function(item){return (item.id == "kpi03");}); 

Спасибо большое!

ответ

6

Вы можете использовать indexOf в фильтре, как этот

var res = a.filter(function (el) { 
    return kpis.indexOf(el.id) >= 0; 
}); 

Example

+1

Благодарим за быстрый ответ и пример! Я знал, что должно быть более элегантное решение :) – Schw4rz

1

Просто сделать использование Array.indexOf

var b = a.filter(function(item){return kpids.indexOf(item.id) > -1 }); 

Array.indexOf возвращает индекс аргумента, переданного в массиве, на котором indexOf вызывается. Он возвращает -1, если нет элемента, который мы ищем.

Итак, мы уверены, что индекс больше -1

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