2014-10-15 3 views
0

У меня есть массив, определенный как так:IndexOf возвращает -1 для значения, которое существует в массиве

var numeric = [{ Value: "0" }, { Value: "1" }, { Value: "2" }, { Value: "3" }]; 

Я пытаюсь определить, является ли конкретное значение существует в этом массиве. Я пробовал все следующие строки, которые все возвращают -1.

numeric.indexOf(1); 
numeric.indexOf("1"); 
numeric.indexOf({Value: "1"}); 

Предположим, что у меня нет контроля над тем, как определяется массив. Как определить, существует ли значение в этом конкретном типе массива?

+3

Напишите свою собственную функцию, которая проходит через массив и проверяет, соответствует ли значение свойства 'Value' вашим параметрам. 'indexOf' только проверяет, содержит ли массив значение, оно не является« сложным »или умным. –

+2

Имейте в виду, что' new Object === new Object' возвращает 'false', объекты равны, только если ссылка одинаков. – Nit

+0

@meder Да, я просто стараюсь избегать добавления вспомогательной функции, чтобы мой код был чистым, насколько это возможно. Если это не проблема (это не домашнее задание с произвольными требованиями) – tnw

ответ

2

Вам нужно будет проходить через массив и проверить свойство.

var numeric = [{ Value: "0" }, { Value: "1" }, { Value: "2" }, { Value: "3" }]; 
 

 
var index=-1; 
 
for(var i = 0; i<numeric.length; i++) 
 
    if(numeric[i].Value === "2") { 
 
     index = i; 
 
     break; 
 
    } 
 
console.log(index);

+0

Принимая как лучший ответ на обсуждение ниже (использование цикла 'break' и normal' for') – tnw

2

Вы можете цикл Повсеместно объекта с петлей:

var numeric = [{ 
 
    Value: "0" 
 
}, { 
 
    Value: "1" 
 
}, { 
 
    Value: "2" 
 
}, { 
 
    Value: "3" 
 
}]; 
 

 
for (var key in numeric) { 
 
    var value = numeric[key]; 
 
    if (value.Value == "1") { 
 
     console.log("ok"); 
 
    } 
 
}

После @MattBurland комментарии вы можете использовать обычный for тоже:

var numeric = [{ 
 
    Value: "0" 
 
}, { 
 
    Value: "1" 
 
}, { 
 
    Value: "2" 
 
}, { 
 
    Value: "3" 
 
}]; 
 

 
for (var i = 0; i < numeric.length; i++) { 
 
    var value = numeric[i]; 
 
    if (value.Value == "1") { 
 
     console.log("ok"); 
 
    } 
 
}

+2

Не используйте 'for ... in' для итерации массивов. Используйте регулярный цикл 'for'. –

+0

@MattBurland Почему? Любопытный – tnw

+1

В этом случае я бы отправился на 'while' вместо' for' вообще –

2

Поскольку числовой массив можно использовать .findIndex():

var search = 1; 
var found = numeric.findIndex(function(n) {return n.value == search}); 

найден будет индекс элемента со значением == 1, если тот не нашел, что это будет - 1. Reference here.

Если вам нужен логический результат, то лучше использовать .some():

var found = numeric.some(function(n) {return n.value == search;}); 

Reference here. Обратите внимание, что обе функции не поддерживаются более старыми браузерами.

+0

Вы должны дайте людям понять, что это от предстоящего стандарта, который еще не завершен, и его нужно будет закрепить в большинстве браузеров. В любом случае, почему бы не использовать '.some()' ES5 вместо этого? Это будет иметь больший смысл, поскольку логический результат все равно нужен. –

+0

@sqint Спасибо, я не заметил, что OP хочет получить логический результат. Я уточню свой ответ. –

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