Поиск массива для lastIndexOf, где свойство класса истинно

У меня есть массив классов, все из которых имеют свойство isPurchased, я хочу вернуть последний элемент в массиве, для которого установлено значение true.

function ShopItem = new function(id, name, isPurchased) {
    this.id = id;
    this.name = name;
    this.isPurchased = isPurchased;
}    

var apple = ShopItem(1, "Apple", false);
var banana = ShopItem(2, "Banana", true);
var pear = ShopItem(3, "Pear", false);

var shopItems = [apple, banana, pear];

var x = shopItems.lastIndexOf(this.isPurchased == true);
console.log(x);

Когда я делаю console.log(x); Я хочу, чтобы он вернул класс банана.

Все работает нормально, пока я не попытаюсь найти последний элемент, и для этого я попытался использовать:

var x = shopItems.lastIndexOf(this.isPurchased == true);

Но он возвращает -1.

Редактировать:

У меня есть способ решить решение, используя код:

var y = null;

for(var o in shopItems) {
    if(shopItems[o].isPurchased == true) {
        y = shopItems[o];
    }
}

console.log(y);

Но если lastIndexOf может решить мою проблему за меня, то я предпочел бы использовать это вместо того, чтобы изобретать велосипед.


person Community    schedule 31.08.2014    source источник
comment
lastIndexOf ищет фиксированное значение. Он не принимает условие (правильный термин: предикат), и даже если бы это было так, вы не указываете предикаты таким образом.   -  person Jon    schedule 31.08.2014


Ответы (1)


lastIndexOf ищет значения и не проверяет условия, плюс this.isPurchased == true — это выражение, а не лямбда. Это было бы похоже на проверку shopItems.lastIndexOf(true). Это не встроено в JavaScript (даже в ES6, который предлагает Array.prototype.find[Index], но не findLast), поэтому вам придется создать его самостоятельно:

function findLast(items, predicate) {
    for (var i = items.length - 1; i >= 0; i--) {
        var item = items[i];

        if (predicate(item)) {
            return item;
        }
    }
}

и используйте его с функцией обратного вызова:

var x = findLast(shopItems, function (item) {
    return item.isPurchased;
});
person Ry-♦    schedule 31.08.2014
comment
Спасибо за решение, я предпочитаю этот метод делать то, что мне нужно. - person ; 31.08.2014