Поиск в многомерном массиве (Алгоритм) - PullRequest
1 голос
/ 16 июня 2020

Вопрос

Напишите функцию, которая получает последовательность и значение и возвращает истину / ложь в зависимости от того, существует ли переменная в многомерной последовательности.

Пример:

locate(['a','b',['c','d',['e']]],'e'); // should return true
locate(['a','b',['c','d',['e']]],'a'); // should return true
locate(['a','b',['c','d',['e']]],'f'); // should return false

Кажется, мое решение работает, но Code Wars говорит: «arr.flat не является функцией.

Я использую бесплатный браузер лагеря кода для запуска и тестирования моего кода, и мои журналы консоли предполагали, что он работает, но Code Wars говорила, что arr.flat не является функцией. Вот мой код:

var locate = function(arr, value){
  let count = 0;
  arr.flat().map((item)=>{
    value == item ? count++ : count;
  });

  return count > 0 ? true : false;
}

Мой вопрос

Мой код правильный или нет? Если нет, то что не так. Если да, то почему Code Wars может выдавать ошибку?

Ответы [ 4 ]

2 голосов
/ 16 июня 2020

Вы можете использовать рекурсивный подход с коротким замыканием на find.

function locate(array, value) {
    return array.some(v => Array.isArray(v) && locate(v, value) || v === value);
}

console.log(locate(['a', 'b', ['c', 'd', ['e']]], 'e')); // true
console.log(locate(['a', 'b', ['c', 'd', ['e']]], 'a')); // true
console.log(locate(['a', 'b', ['c', 'd', ['e']]], 'f')); // false
1 голос
/ 17 июня 2020

Поскольку flat поддерживается в вашей среде, напишите собственный плоский метод и используйте includes

const flat = (arr, res = []) => (
  arr.forEach((item) =>
    Array.isArray(item) ? flat(item, res) : res.push(item)
  ),
  res
);

const locate = (arr, value) => flat(arr).includes(value);

console.log(locate(["a", "b", ["c", "d", ["e"]]], "e"));
console.log(locate(["a", "b", ["c", "d", ["e"]]], "a"));
console.log(locate(["a", "b", ["c", "d", ["e"]]], "f"));
1 голос
/ 16 июня 2020

Вам на самом деле не нужно .flat для этого (хотя это позволило бы наиболее элегантное решение const locate = (arr, value) => arr.flat().includes(value);). Вот простое рекурсивное решение с использованием обычного for l oop:

const locate = function(arr, value) {
  for(let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i]) {
      if (locate(arr[i], value) {
        return true;
      } 
    }
    if (arr[i] === value) {
      return true;
    } 
  }
  return false;
} 
1 голос
/ 16 июня 2020

Кажется, здесь работает. Так что скорее всего, браузер, в котором вы тестируете, не поддерживает flat()

var locate = function(arr, value){
  let count = 0;
  arr.flat().map((item)=>{
    value == item ? count++ : count;
  });
  return count > 0 ? true : false;
}

console.log(locate(['a','b',['c','d',['e']]],'e')); // should return true
console.log(locate(['a','b',['c','d',['e']]],'a')); // should return true
console.log(locate(['a','b',['c','d',['e']]],'f')); // should return false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...