Как проверить, существует ли массив чисел в Object

0

Я пытаюсь написать код, который будет проверять, существует ли группа объектов, хранящихся в массиве, в объекте. С кодом, который у меня есть, он всегда возвращается -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.

Теги:

2 ответа

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));

Подробнее об этом методе можно прочитать здесь.

  • 0
    как вывести соответствующие целые числа на консоль
  • 1
    сохранить логический результат в переменной. Например: var res = (x в squaresClicked). Затем console.log (x), если это правда.
1

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 Две причины, по которым мне это не нравится:

  • Он будет перебирать весь массив, даже если он уже ясно, что он потерпит неудачу
  • Он использует двойное отрицание в своей логике

Ещё вопросы

Сообщество Overcoder
Наверх
Меню