В вашей код, когда выполняется следующая строка, вы также увеличить значение i
которое является вашей управляющей переменной:
if (fullArr[i][i] == fullArr[i++][i++])
Таким образом, это то, как ваша i
переменная получает приращение в каждой итерации:
Iteration # 1:i = 0
Итерация # 2:i = 3
- вы получите я + 2 из строка, о которой я упоминал выше, +1 больше от инкремента, который вы указываете в конечном состоянии цикла for
Таким образом, даже после первой итерации ваша функция вернет пустой массив в вашем конкретном сценарии, так как вы передавая массив длиной 3, а цикл for заканчивается после i = 0
на первой итерации.
Даже если цикл будет продолжаться, он вернет исключение индекса за пределы, потому что ваш массив длины 3 не будет иметь элемент array[3]
.
Например, если вы хотите сравнить только два массива, как в вашем случае, вам нужно перебрать каждый из них и сравнить их элементы:
function sym(array1, array2) {
var results = [];
for (var i = 0; i < array1.length; i++) {
for (var j = 0; j < array2.length; j++) {
if(array1[i] === array2[j]) {
if(results.indexOf(array1[i]) === -1) {
results.push(array1[i]);
}
}
}
}
return results;
}
sym([1, 2, 3], [5, 2, 1, 4]);
Я также построил решение, возвращающую пересечение массивов, которые вы предоставляете в качестве параметров для функции, независимо от того, сколько массивов есть:
function sym(args) {
var paramSet = Array.prototype.slice.call(arguments);
var counterObject = {};
var results = [];
paramSet.forEach(function (array) {
// Filter the arrays in order to remove duplicate values
var uniqueArray = array.filter(function (elem, index, arr) {
return index == arr.indexOf(elem);
});
uniqueArray.forEach(function (element) {
if (Object.prototype.hasOwnProperty.call(counterObject, element)) {
counterObject[element]++;
} else {
counterObject[element] = 1;
}
});
});
for (var key in counterObject) {
if (counterObject[key] === paramSet.length) {
results.push(parseInt(key));
}
}
return results;
}
sym([1, 2, 3, 3, 3], [5, 2, 1, 4], [1, 7, 9, 10]);
Приведенные выше код будет возвращать [1]
для примера, который я представил, как это пересечение всех- массивы.
'fullArr [i ++] [i ++]' не делает то, что вы думаете. Это увеличивает время i * каждый раз, и это невероятно плохая практика (даже когда она работает), потому что люди, читающие ее, не могут помнить, что я сначала увеличиваю, поэтому они не уверены, означает ли это 'fullArr [1] [2] 'или' fullArr [2] [1] ' –
. Что, если список 1 был 1,1,2,3, а список 2 - 1,1,1,2,3? Сколько раз должно появляться 1 в конечном выходном массиве –
Также вы указали, что делать, если есть n массивов .... мы просто собираем только те значения, которые являются общими для всех трех? –