JS array.include () // массив в массиве // [['a']]. Includes (['a']) возвращает false - PullRequest
0 голосов
/ 30 марта 2020

TL; DR: приведенный ниже код JavaScript возвращает false , где я ожидаю true , какой лучший обходной путь?

 console.log([['a']].includes(['a']))

Я помещаю массивы в массивы (для работы с диапазонами листов google в скрипте приложений, но в обычном JavaScript поведение такое же).

Я хотел бы проверить, содержит ли мой родительский массив (назовем его [['' ']] ) специфицированный c дочерний массив (например, [' a '] ).

К сожалению, array.include () не работает должным образом, когда параметр является массивом. (код, приведенный выше, возвращает false, если оно должно быть истинным, насколько я знаю)

Я что-то упустил? Как вы думаете, что будет лучшим решением?

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Проблема заключается в сравнении массивов .

console.log(['a'] == ['a']); //false

Когда метод .includes() проходит по массиву, в котором он вызывается, он проверяет каждый элемент, чтобы определить, является ли он равно значению, которое проверяется, пока не найдет совпадение или не проверит каждый элемент массива. Как вы можете видеть выше, когда проверяемое значение является массивом, оно не будет работать.

Обходным путем будет написание собственной функции .includes(), в которой вы будете l oop через весь дочерний элемент. массивы в родительском массиве и для каждого дочернего массива l oop через каждый элемент, проверяя, равен ли он соответствующему элементу в тестовом массиве. Для этого вы можете использовать .every() метод .

let array = [['a']];

function includesArray(parentArray, testArray) {
    for (let i = 0; i < parentArray.length; i++) {
        if (parentArray[i].every(function(value, index) { return value === testArray[index]})) {
            return true;
        }
    }
    return false;
}

console.log(includesArray(array, ['a'])); //true
console.log(includesArray(array, ['b'])); //false
0 голосов
/ 30 марта 2020

Одна быстрая альтернатива - сравнивать массивы JSON strigified вместо непосредственного сравнения массивов.

console.log([['a']].map(x => JSON.stringify(x)).includes(JSON.stringify(['a'])))
...