2016-04-01 2 views
0

У меня есть объект Javascript, как так ...Расширенный Array.prototype.filter с Javascript

var strategies = [{ 
    "strategy": { 
     "category": "war" 
    } 
}, { 
    "strategy": { 
     "category": "farming" 
    } 
}] 

Я тогда массив, который указывает, какие результаты я хотел бы вернуться. Это может быть любое из следующего: [] OR ["war"]["farming"] OR ["war", "farming"].

Если у нас есть [], я не хочу возвращать результаты. Но если ["war", "farming"] Я хочу вернуть оба вышеперечисленных результата.

Как это сделать с помощью Array.prototype.filter? Я видел this post, но не мог объяснить это.

strategies.filter((strategy) => 
    ???? 
) 

Благодарим за помощь.

+1

так, стратегия является объектом. Вам нужно вернуть true, если оно соответствует функции, или false, если нет. Похоже, что вы фильтруете набор в массиве – Fallenreaper

+0

И вы можете использовать ['indexOf'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) чтобы узнать, содержит ли массив заданное значение. –

+0

Хороший пункт Gents. Если я получу значение выше -1 в indexOf, я могу вернуть true – thedanotto

ответ

4

Вы можете просто проверить значение с indexOf:

var categories = ['war', 'farming']; 

var filtered = strategies.filter((obj) => { 
    return categories.indexOf(obj.strategy.category) > -1; 
}); 
+0

Спасибо, это похоже на то, что мне нужно. Примите, когда это возможно. – thedanotto

+0

@thedanotto сладкий! –

1

Ваш объект, стратегия была обернута объектом, поэтому моя первая линия была установка в своей внутренней стратегии, а затем фильтровать по мере необходимости.

var strategies = [{ 
    "strategy": { 
     "category": "war" 
    } 
}, { 
    "strategy": { 
     "category": "farming" 
    } 
}] 
var b = ["war", "farming"]; 
strategies.filter(function(strategy){ 
    strategy = strategy.strategy; 
    for(var i in b){ 
    if (b[i] == strategy["category"]) { 
     return true; 
     } 
    } 
    return false; 
}); 
1

Проверяет массив ввода, чтобы увидеть, если он пустой в соответствии с вашими требованиями:

function filterObj(arr) { 
    return !arr.length ? arr : 
    strategies.filter((el) => arr.indexOf(el.strategy.category) > -1); 
} 

filterObj(['war', 'farming']) 

DEMO