2016-09-15 5 views
2

Как проверить равенство между элементами двух массивов без использования внешних библиотек (и предпочтительно с использованием ES5)?Проверить равенство между двумя массивами

Я хочу проверить равенство между ними, не заботясь о порядке элементов. Таким образом, в моей ситуации равны два массива [1,2,3] и [2,3,1].

Я предполагаю, что я должен написать функцию

function isEqual(arr1, arr2) { 
    arr1.forEach(el => { 
    if (arr2.indexOf(el) === -1) { 
     return false; 
    } 
    }); 

    arr2.forEach(el => { 
    if (arr1.indexOf(el) === -1) { 
     return false; 
    } 
    }); 

    return true; 
} 
+0

Есть тонны вопросов здесь, такие как то, что, если они находятся в разной длине и имеют повторяющиеся элементы. – Redu

+0

Является ли '[1,2,3]' и '[1,3,3,2]' также равным для вас? –

ответ

3

Вы можете использовать JSON.stringify и Array#sort методы. Сортируйте оба массива ang, сравнивая их после преобразования в строку JSON.

function isEqual(arr1, arr2) { 
 
    return JSON.stringify(arr1.sort()) === JSON.stringify(arr2.sort()); 
 
} 
 

 
console.log(isEqual([1, 2, 3], [2, 3, 1])); 
 
console.log(isEqual([1, 2, 3], [2, 4, 1])); 
 
console.log(isEqual([1, 2, 3, 3], [2, 3, 1])); 
 
console.log(isEqual([1, 2, 3, 3], [2, 4, 1, 1]));


Или вместо JSON.stringify вы также можете использовать Array#join метод (Предложил @JonCarter), что делает его немного более простым.

function isEqual(arr1, arr2) { 
 
    return arr1.sort().join() === arr2.sort().join(); 
 
} 
 

 
console.log(isEqual([1, 2, 3], [2, 3, 1])); 
 
console.log(isEqual([1, 2, 3], [2, 4, 1])); 
 
console.log(isEqual([1, 2, 3, 3], [2, 3, 1])); 
 
console.log(isEqual([1, 2, 3, 3], [2, 4, 1, 1]));

+0

Мне это нравится - он короткий и элегантный. Просто предложение: использование Array.join() может быть немного лучше, чем JSON.stringify. например 'arr1.sort(). join() === arr2.sort(). join()' –

+1

@JonCarter: ничего себе было бы намного лучше ..... спасибо и обновили ответ с вашим предложением :) –

+1

Спасибо ! Отличное решение – Jamgreen

0

Вы можете использовать Array#every утверждать значение равно. Это очень рудиментарно, хотя используется строгая проверка равенства, которая имеет свои ограничения. Но это показывает грубую структуру для итерации по массиву.

ПРИМЕЧАНИЕ. Поскольку массивы представляют собой индексированные списки, предполагается, что для их равного они должны иметь равные значения в одном и том же индексе.

var arr1 = [1,2,3,4]; 
 
var arr2 = [1,2,3,4]; 
 
var arr3 = [1,2,4]; 
 
var arr4 = [1,2,2,4]; 
 

 
function isArrEql(a1, a2) { 
 
    return a1.length === a2.length && a1.every(function(v, i) { 
 
    return v === a2[i]; 
 
    }); 
 
} 
 

 
console.log('arr1, arr2: ', isArrEql(arr1, arr2)); 
 
console.log('arr1, arr2: ', isArrEql(arr1, arr3)); 
 
console.log('arr1, arr2: ', isArrEql(arr1, arr4));

+0

Но это 'a1.every ((v, i) => v === a2 [i])' то же самое, что 'a2.every ((v, i) => v === a1 [i])' ? Разве мне не нужно проверять оба пути? – Jamgreen

+0

@Jamgreen Это то, что для проверки длины. Если оба массива имеют одинаковую длину, то повторение по одному и сопоставление соответствующего значения с другим массивом будет иметь тот же результат. –

Смежные вопросы