Проверка значений одного массива относительно другого в JS - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь проверить, что первый массив содержит те же значения, что и второй массив. Однако я не совсем понимаю свой код.

Первый вопрос: почему мой код выполняет мой оператор else, если все буквы в первом массиве содержатся во втором? он запустит 2 строки «это неверно»

Второй вопрос: если мой первый массив содержит повторяющуюся букву, он все равно пройдет проверку, например, [«a», «b», «a», "d", "e", "f"]; даже если в первом есть два знака «а», он снова увидит «а». Кто-нибудь знает способ обойти это.

Извините за мои длинные запутанные вопросы, но я надеюсь, что это имеет смысл. Спасибо:)

var letters = ["a", "b" , "c", "d", "e", "f"];
var otherLetters = ["a","b", "c" , "d", "e", "f"];

var i = -1;

while(i<=letters.length){



i++;
    if(otherLetters.includes(letters[i])){
        console.log("This is valid");
    }

    else 

    console.log("This is not valid");



}

Ответы [ 7 ]

1 голос
/ 03 февраля 2020

Вы не закрыли скобки. И ваш l oop очень запутанный, пожалуйста, используйте foreach. Вот рабочий пример:

const letters = ["a", "b" , "c", "d", "e", "f"];
const otherLetters = ["a","b", "c" , "d", "e", "f"];

letters.forEach(el => {
  if (otherLetters.includes(el)) {
    console.log(el + 'is valid');
  } else {
    console.log(el + 'is not valid');
  }
});
0 голосов
/ 03 февраля 2020

Ничего страшного, cpog90.

Попробуйте это решение.

    var letters = ["a", "b" , "c", "d", "e", "f"];
    var otherLetters = ["a","b", "c" , "d", "e", "f"];
    
    var i = 0;
    while(i<letters.length){
        if(otherLetters.includes(letters[i])){
            console.log("This is valid");
        }
        else {
           console.log("This is not valid "+i);
        }
        i++;
    }

Что пошло не так в вашей логике c?

Если вы объявите i = -1 и while (i <= letters.length), так как 6 - это длина букв, 8 итераций будут выполнены следующим образом. </p>

Для первой итерации (i = -1) условие 'while' возвращает true и проверяет 'a'

вывод: Это действительно

Для второй итерации (i = 0) условие while возвращает значение true и проверяет b '

output: Это действительно

Для третьей итерации (i = 1) условие while возвращает значение true и проверяет вывод c

: This допустимо

Для четвертой итерации (i = 2) условие 'while' возвращает true и проверяет вывод 'd'

: это действительно

Для пятой итерации (i = 3) условие 'while' возвращает true и проверяет вывод 'e'

: это действительно

Для шестая итерация (i = 4), условие while возвращает true и проверяет 'f'

вывод: Это действительно

Для седьмой итерации (i = 5) условие while возвращает true и проверяет неопределенное значение.

вывод: Это недопустимо

Для восьмой итерации (i = 6) условие while возвращает значение true и проверяет неопределенное значение.

вывод: Это недействительно

0 голосов
/ 03 февраля 2020

Вы можете использовать комбинацию Array.prototype.every с Array.prototype.includes вместе с некоторыми дополнительными пунктами защиты.

const areSequenceEqual = (arr1, arr2) => {
  if (!arr1 || !arr2) {
    return false;
  }

  if (arr1.length !== arr2.length) {
    return false;
  }

  return arr1.every(x => arr2.includes(x));
};

const letters = ["a", "b", "c", "d", "e", "f"];
const otherLetters = ["a", "b", "c", "d", "e", "f"];
const someOtherLetters = ["a", "b", "c", "d", "e", "f", "g"];

console.log(areSequenceEqual(letters, otherLetters));
console.log(areSequenceEqual(letters, undefined));
console.log(areSequenceEqual(letters, someOtherLetters));
0 голосов
/ 03 февраля 2020

Массивы основаны на индексе и начинаются с 0. Таким образом, проверка -1 и меньше букв.длина выводит код за пределы.

var letters = ["a", "b" , "c", "d", "e", "f"];
var otherLetters = ["a","b", "c" , "d", "e", "f"];
var i = 0;
while(i<letters.length)
{
    if(otherLetters.includes(letters[i]))
    {
        console.log("This is valid");
    }
    else
    {
        console.log("This is not valid");
    }
    i++;
}
0 голосов
/ 03 февраля 2020

Самое простое решение - это loda sh. Он имеет все оптимизации "из коробки":

var letters = ["a", "b" , "c", "d", "e", "f"];
var otherLetters = ["f", "a","b", "c" , "d", "e"];

const finalLetters = _.sortBy(letters);
const finalOtherLetters = _.sortBy(otherLetters);

if (_.isEqual(finalLetters, finalOtherLetters)) {
  console.log('Two arrays are equal.');
} else {
  console.log('Two arrays are not equal.');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
0 голосов
/ 03 февраля 2020

Прежде всего вы установили i = -1, что сбивает с толку, поскольку начальная позиция массива равна 0. Причина, по которой ваш l oop запускается еще два раза, заключается в том, что l oop начинался с -1 вместо 0 и затем условие я <= длина. </p>

Поскольку [длина массива = последний индекс + 1], ваш l oop запускается дополнительно два раза. Просто, чтобы ваш код работал, присвойте var i = 0, а в то время как условие i

0 голосов
/ 03 февраля 2020

Вы пытаетесь получить доступ к элементам массива, которые находятся за пределами. Скрипт выполняет 8 итераций в массиве из 6 элементов.

...