Подтвердить что ты не робот

Как использовать indexOf в KnockoutJS

Все примеры, которые я вижу при использовании метода IndexOf() в KnockoutJS, имеют основные типы строк. Я хочу знать, как вернуть индекс массива, который является объектом, на основе одной из переменных объекта.

4b9b3361

Ответ 1

НаблюдаемыйArray предоставляет метод под названием indexOf, который является оберткой для ko.utils.arrayIndexOf, которая просто перебирает массив, ища элемент, который вы передаете ему.

Итак, если у вас есть элемент, который вы можете сделать:

var viewModel = {
   items: ko.observableArray([{id: 1, name: "one"}, {id:2, name: "two"}])
};

var item = viewModel.items()[1];

console.log(viewModel.items.indexOf(item)); //equals 1

Если у вас есть что-то вроде ключа, то у KO есть функция утилиты, называемая ko.utils.arrayFirst, которая просто перебирает массив, пытаясь совместить условие, которое вы передаете ему. Однако он возвращает элемент, а не его индекс. Было бы немного неэффективно получить объект, а затем вызвать indexOf на нем, так как вы сделали бы два прохода через массив.

Вы можете просто написать цикл самостоятельно, ища подходящий элемент или написать общую функцию на основе ko.utils.arrayFirst, которая будет выглядеть так:

function arrayFirstIndexOf(array, predicate, predicateOwner) {
    for (var i = 0, j = array.length; i < j; i++) {
        if (predicate.call(predicateOwner, array[i])) {
            return i;
        }
    }
    return -1;
}

Теперь вы можете передать массив, условие, и вам будет возвращен индекс первого элемента, который соответствует.

var viewModel = {
    items: ko.observableArray([{
        id: 1,
        name: "one"},
    {
        id: 2,
        name: "two"}])
};

var id = 2;

console.log(arrayFirstIndexOf(viewModel.items(), function(item) {
   return item.id === id;    
})); //returns 1