Простой вопрос, но я не знаю, как решить этотолько возвращаемые значения во всех массивах
У меня есть несколько массивов, но я хочу только значения, что все массивы имеют в общей
Im использованием JavaScript.
Простой вопрос, но я не знаю, как решить этотолько возвращаемые значения во всех массивах
У меня есть несколько массивов, но я хочу только значения, что все массивы имеют в общей
Im использованием JavaScript.
Я думаю, что это должно сработать.
var arr1 = [1,2,3,4]
, arr2 = [2,3,4,5]
, arr3 = [3,4,5,6]
, arrs = [arr1, arr2, arr3];
var all = arr1.concat(arr2.concat(arr3)).sort()
, red1 = all.filter(
function(val, i, arr) {
return i === arr.lastIndexOf(val)-1;
})
, red2 = red1.filter(
function(val, i, arr) {
var shared = true;
arrs.forEach(
function(arr, i, src) {
if (arr.indexOf(val) === -1)
shared = false;
})
return shared;
})
Что-то, как это должно работать:
function getCommonElements() {
var common = [],
i, j;
if (arguments.length === 0)
return common;
outerLoop:
for (i = 0; i < arguments[0].length; i++) {
for (j = 1; j < arguments.length; j++)
if (-1 === arguments[j].indexOf(arguments[0][i]))
continue outerLoop;
common.push(arguments[0][i]);
}
return common;
}
вызова с любым количеством массивов в качестве аргументов:
var commonEls = getCommonElements(arr1, arr2, arr3, etc);
В случае это не очевидно, что идея заключается в петлю через массив из первого аргумента и проверить каждый его элемент на другие массивы. Как только определенный элемент будет найден в , а не быть в любом из других массивов из других аргументов, продолжайте со следующего элемента. В противном случае добавьте текущий элемент в выходной массив, common
.
Если вам нужна поддержка браузеров (IE < 9), которые не поддерживают Array.indexOf()
method вы можете включить shim shown at the MDN page или заменить тест .indexOf()
из моего кода с другим контуром.
Если вы озабочены только современными браузерами, которые поддерживают уменьшить(), а затем использовать это решение:
Finding matches between multiple JavaScript Arrays
Если вы должны поддерживать IE6, а затем использовать мое решение ниже. Вот как я это работает в IE6 с помощью JQuery:
// Find common values across all arrays in 'a',
// where 'a' is an array of arrays [[arr1], [arr2], ...]
Object.common = function(a) {
var aCommon = [];
for (var i=0,imax=a[0].length,nMatch,sVal; i<imax; i++) {
nMatch = 0;
sVal = a[0][i];
for (var j=1,jmax=a.length; j<jmax; j++) {
nMatch += ($.inArray(sVal, a[j])>-1) ? 1 : 0;
}
if (nMatch===a.length-1) aCommon.push(sVal);
}
return aCommon;
}
В принципе, вы просто цикл по каждому значению первого массива в «а», чтобы увидеть, если он существует в других массивах. Если он существует, вы увеличиваете nMatch, а после сканирования других массивов вы добавляете значение в массив aCommon, если nMatch равно общему числу других массивов.
Используя данные примера, предоставленные Флорианом Салиховичем, Object.common(arrs)
вернет [3, 4]
.
Если вы не можете использовать JQuery, то замените $ .inArray() с кодом, предоставленной Mozilla:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/IndexOf
Не может действительно следовать этому. Но я думаю, что это правильный путь. Согласовать все массивы и значения, которые происходят так часто, как количество массивов - общие значения. – BadKnees
Прохладный пример того, как обфускать даже простой javascript с минимальными усилиями. – RobG
Я согласен @RobG. BadKnees даже упомянул, что не мог следовать за ним, но все равно принял его. (Мой путь, возможно, был квитианским, но он оказался короче _and_ (по-моему) легче следовать.) – nnnnnn