JavaScript функция для проверки равенства двух массивов - PullRequest
0 голосов
/ 07 января 2020

Мне поручено написать функцию, которая принимает два одномерных массива простых значений (без объектов и т. Д. c) и возвращает true, только если они равны. Функция также должна использовать метод Array.forEach().

До сих пор я пробовал

function eql(arr1, arr2) {
  if(arr1.length !== arr2.length){return false}
  arr1.forEach((element, index) => {
    if(element !== arr2[index]){
      return false
    }
  })
  return true
}

И это позволяет пройти большинство моих тестов, хотя случаи, которые все еще не выполняются

eql([1], [2])
eql(['a', 'b'], ['a', 'c'])
eql([1], ['1'])

Все три из этих случаев возвращают true, когда я ожидаю false. Заранее благодарю за любую помощь, я пытаюсь разобраться в логи c самостоятельно и чувствую, что ударил стену!

Ответы [ 5 ]

7 голосов
/ 07 января 2020

Использование return внутри forEach не имеет смысла. Вы должны использовать every()

function eql(arr1, arr2) {
  if(arr1.length !== arr2.length){return false}
  return arr1.every((e, i) => e === arr2[i]);
}
console.log(eql(['a', 'b'], ['a', 'c']))

console.log(eql([1], [2]))

Если вы действительно хотите использовать forEach(), используйте необходимость для создания локальной переменной.

function eql(arr1, arr2) {
  if(arr1.length !== arr2.length){return false}
  let res = true;
  arr1.forEach((element, index) => {
    if(element !== arr2[index]){
      res = false
    }
  })
  return res;
}

console.log(eql(['a', 'b'], ['a', 'c']))
1 голос
/ 07 января 2020

Настройка переменной isEqual по умолчанию. Если он не равен, он меняется и выводит этот результат. Это потому, что forEach просто перебирает элементы. Вам нужно сделать логи c внутри l oop.

function eql(arr1, arr2) {
  let isEqual = true;
  if(arr1.length !== arr2.length){isEqual = false}
  arr1.forEach((element, index) => {
    if(element !== arr2[index]){
      isEqual = false;
    }
  })
  console.log(isEqual);
}

eql([1], [2])
eql(['a', 'b'], ['a', 'c'])
eql([1], ['1'])

Но на самом деле: используйте JSON.stringify для простых случаев, подобных этому:

function eql(arr1, arr2) {
  console.log(JSON.stringify(arr1) === JSON.stringify(arr2));
}

eql([1], [2])
eql(['a', 'b'], ['a', 'c'])
eql([1], ['1'])
eql([1], [1])
0 голосов
/ 07 января 2020

Из Сеть разработчиков Mozilla

Таким образом, вы пытаетесь сделать то же самое с другими методами итерации, такими как:

function eql(arr1,arr2) {
  if(arr1.length!==arr2.length) { return false }
  return arr1.every((element,index)=>{
    if(element===arr2[index]){
      return true
    } else {
      return false
    }
  });
  
}

console.log(eql([1], ['1']));
console.log(eql(['a', 'b'], ['a', 'c']));
console.log(eql([1], ['1']));
0 голосов
/ 07 января 2020

Если вы говорите, что массивы равны независимо от положения элементов в массиве, как, например, если eql([1,2], [2,1]) должен вернуть true; Вы должны сначала отсортировать массив и использовать сравнение на основе индекса, как в ответах, приведенных выше, либо проверить, существует ли один элемент в другом массиве без необходимости сортировки

function eql(arr1, arr2) {
  if(arr1 === arr2)	//in case primitive values are passed to the function or both arrays happen to have the same reference.
    return true;		
  
  if(arr1.length !== arr2.length)
    return false;
  
  let equal = true;
  arr1.forEach(a => {
    if(!arr2.includes(a)) {	//assuming the order doesn't matter
      equal = false;
      return;
    }
  })
  
  return equal;
}
console.log(eql(['1'], [1]))
console.log(eql([1,2], [2,1]))
0 голосов
/ 07 января 2020

Эта версия может быть немного более понятной для некоторых людей:

function arraysAreEqual(a, b) 
{ 
  if(a.length!=b.length) 
   return False;   // can't be equal if not the same length
  else
  { 
   for(var i=0;i<a.length;i++) {
     if(a[i]!=b[i]) return False;   // quit on first mismatch
   }
   return True;
  } 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...