Я пытаюсь написать код, который будет проверять, существует ли группа объектов, хранящихся в массиве, в объекте. С кодом, который у меня есть, он всегда возвращается -1.
function checkHorizonal() {
var x= ['1', '2' ,'3'];
var y= ['4', '5', '6'];
var z= ['7', '8', '9']
console.log(jQuery.inArray(x, squaresClicked));
}
Это squaresClicked
объектов squaresClicked
:
Object {1: "1", 2: "-1", 3: "1"}
Вы можете видеть, что существуют ключи 1,2,3, но он вернет -1.
Из документа jQuery:
jQuery.inArray( value, array [, fromIndex ] )
jQuery.inArray
не будет работать так, как вы его используете. Он проверяет содержимое массива, а не клавиши объекта. Ваше значение x
отлично, но вы передаете объект вместо массива.
Если вы пытаетесь увидеть, существует ли набор целых чисел в качестве ключей в объекте, вы можете попробовать следующее (если вы используете JavaScript> = 1.6):
myArray.filter(function(x) {
// check if value is a key
return (x in squaresClicked);
}).length == myArray.length;
В принципе, мы перебираем через наш массив и возвращаем только те, которые существуют как ключи в объекте squaresClicked
. Если новый массив имеет ту же длину, что и наш исходный список, то все значения должны существовать как свойства в объекте.
Если вы не хотите искать целую цепочку прототипов объектов для значения массива, вам нужно использовать hasOwnProperty
а не in
.
Вот так:
return (squaresClicked.hasOwnProperty(x));
Подробнее об этом методе можно прочитать здесь.
jQuery inArray
не может иметь дело с массивом игл, иначе
$.inArray(x, Object.keys(squaresClicked));
будет работать. В этом случае вы застряли с итерированием, я думаю (хотя может быть и другой сложный путь - как всегда). Один из способов в jQuery (хотя мне это не очень нравится по разным причинам 1):
var hasFailed = false;
$.each(x, function (index, value) {
if($.inArray(value, Object.keys(squaresClicked)) === -1) {
hasFailed = true;
}
});
return !hasFailed;
Основной подход ванили:
for(var i = 0; i < x.length; i++) {
if(!squaresClicked.hasOwnProperty(x[i])) {
return false;
}
}
return true;
1 Две причины, по которым мне это не нравится: