Посмотрите, существует ли подмассив массива

1

У меня есть массив, который выглядит так:

var array = [[10, 8, 2], [5, 7, 1], [3, 9, 4]];

Мне нужно что-то, что говорит мне, существует ли дополнительный объект, не вызывая ошибки. Вот пример:

elementExsits(array[0][4]);
//false

elementExsists(array[1][2]);
//true

Функция elementExsists бы проверить его путь существует. Я пробовал:

if (typeof array[3][2] !== 'undefined') {};

Но это просто говорит

Cannot read property '2' of undefined
Теги:
arrays

7 ответов

4
Лучший ответ

Вы проверяете одно свойство одновременно. Остановитесь, если вы столкнулись с неопределенным:

if (typeof array[3] !== "undefined" && typeof array[3][2] !== "undefined") {
}

Или лучше:

if (3 in array && 2 in array[3]) {
}
  • 0
    Спасибо, это очень компактный способ сделать это и работает хорошо.
2

Ответ Салмана работает для вашего сценария. Или вы также можете создать динамическую функцию, чтобы возвращать значение в индексе, или undefined, если не найдено.

var array = [[10, 8, 2], [5, 7, 1], [3, 9, 4]];

function elementExists(array, ...indices){
    return indices.reduce((el, i) => el && el[i], array)
}

console.log(elementExists(array, 0, 4))
console.log(elementExists(array, 1, 2))
console.log(elementExists(array, 3, 2))
  • 0
    Это может идти глубже, чем два уровня, верно?
  • 0
    @SalmanA Да. Например .. array = [[10, [1,[11,12]],8, 2]] и elementExists(array,0,1,1,0) дает вам 11 . (Четыре уровня в глубину).
2

Простой оператор if может решить, существует ли элемент:

var array = [[10, 8, 2], [5, 7, 1], [3, 9, 4]];

if (array[1] && array[1][2]) {
  console.log('exists');
} else {
  console.log('doesn\'t exist');
}

if (array[10] && array[10][2]) {
  console.log('exists');
} else {
  console.log('doesn\'t exist');
}

Пытаться получить доступ к значению массива, который не существует, возвращается undefined, поэтому если инструкции будут переключаться на основе результата.

  • 0
    Попробуйте ту же идею для array[10][1] .
  • 0
    @SalmanA это работает? Не могу проверить это сейчас.
Показать ещё 2 комментария
0

function elementExists(a, i, j) {
  return Array.isArray(a) && Array.isArray(a[i]) && a[i].length > j;
}

console.log(elementExists(null, 0, 1));
console.log(elementExists(undefined, 0, 1));
console.log(elementExists(0, 0, 1));
console.log(elementExists('foo', 0, 1));
console.log(elementExists([], 0, 1));
console.log(elementExists([null], 0, 1));
console.log(elementExists([0], 0, 1));
console.log(elementExists([[]], 0, 1));
console.log(elementExists([[],[]], 0, 1));
console.log(elementExists([[3],[9]], 0, 1));
console.log(elementExists([[3,2],[9]], 0, 1));
  • 0
    Спасибо, что нашли время, чтобы опубликовать этот ответ. Похоже, это чрезвычайно универсально.
0

Эта проблема

У вас есть только 3 элемента в вашем массиве в первом измерении. Это означает, что вы получите сообщение об ошибке при попытке вызвать индекс в неопределенном элементе. Вы можете связать оператор if с && следующим образом:

if (typeof array[3] !== 'undefined' && typeof array[3][2] !== 'undefined') {};

Вы также можете сделать что-то вроде следующего, чтобы иметь функцию, которая проверяет и как много измерений для существования по мере необходимости (также предлог использовать рекурсию с моей стороны). Просто pas в массиве и индексы, которые он должен проверять в многомерном массиве.


Рекурсивная проверка многомерного массива

let array = [[10, 8, 2], [5, 7, 1], [3, 9, 4]];

function testArray(array, ...rest) {
    if (rest.length > 0) {
      console.log(rest[0])
      let subArray = array[rest[0]]

      if (!subArray )
        return false;

      rest.shift(0);
      return testArray(subArray, ...rest)
    }
    return true;
}

console.log(testArray(array, 3, 2));
0

Вы можете взять массив и список индексов и использовать Array.every() индексы. Если все индексы не undefined элемент существует. Если событие одно не undefined, элемент не существует.

const elementExists = (array, ...indexes) => {
  let current = array;
  
  return indexes.every(index => {
    current = array[index];
    
    return current !== undefined;
  });
};

const array = [[10, 8, 2], [5, 7, 1], [3, 9, 4]];

console.log(elementExists(array, 0, 4)); // false

console.log(elementExists(array, 1, 2)); // true

console.log(elementExists(array, 3, 2)); // false
0

Вы можете использовать in операторе и проверить, существует ли индекс. Затем перейдите к следующему вложенному массиву.

Это решение работает с массивом и массивом индексов и использует короткое замыкание с Array#every, если индекс не находится в данном массиве.

function elementExsists(array, indices) {
    return indices.every(i => Array.isArray(array) && i in array && (array = array[i], true))
}

var array = [[10, 8, 2], [5, 7, 1], [3, 9, 4]];

console.log(elementExsists(array, [0, 4]));  // false
console.log(elementExsists(array, [1, 2])); //  true
  • 0
    Спасибо, что нашли время ответить на вопрос. Очень ценится

Ещё вопросы

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