現在,您已經在問題中添加了不確定數量的數組,這是另一種方法,它將每個項目的計數收集到一個對象中,然后整理具有最大計數的項目。
這種方法的優點:
如果數組較大,那么強力搜索選項(由其他答案使用)的速度要快15倍
不需要ES5或ES5墊片(適用于所有瀏覽器)
完全非破壞性(根本不改變源數據)
處理源數組中的重復項
處理任意數量的輸入數組
這是代碼:
function containsAll(/* pass all arrays here */) {
var output = [];
var cntObj = {};
var array, item, cnt;
// for each array passed as an argument to the function
for (var i = 0; i < arguments.length; i++) {
array = arguments[i];
// for each element in the array
for (var j = 0; j < array.length; j++) {
item = "-" + array[j];
cnt = cntObj[item] || 0;
// if cnt is exactly the number of previous arrays,
// then increment by one so we count only one per array
if (cnt == i) {
cntObj[item] = cnt + 1;
}
}
}
// now collect all results that are in all arrays
for (item in cntObj) {
if (cntObj.hasOwnProperty(item) && cntObj[item] === arguments.length) {
output.push(item.substring(1));
}
}
return(output);}工作演示:http://jsfiddle.net/jfriend00/52mAP/
僅供參考,這不需要ES5,因此可以在沒有墊片的情況下在所有瀏覽器中使用。
在每1000個長15個陣列的性能測試中,這比我在jsperf中使用的搜索方法快了10倍以上:http://jsperf.com/in-all-arrays 。
這是一個使用ES6 Map并Set進行重復數據刪除和跟蹤計數的版本。這樣做的優點是數據類型可以保留并且可以是任何東西(它甚至不需要進行自然的字符串轉換,數據甚至可以是對象,盡管對象是完全相同的對象,而不是相同的對象屬性/值)。
var arrays = [
['valueOf', 'toString','apple', 'orange', 'banana', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza', 1, 2, 999, 888],
['valueOf', 'toString','taco', 'fish', 'fish', 'apple', 'pizza', 1, 999, 777, 999, 1],
['valueOf', 'toString','banana', 'pizza', 'fish', 'apple', 'apple', 1, 2, 999, 666, 555]
];
// subclass for updating cnts class MapCnt extends Map {
constructor(iterable) {
super(iterable);
}
cnt(iterable) {
// make sure items from the array are unique
let set = new Set(iterable);
// now update the cnt for each item in the set
for (let item of set) {
let cnt = this.get(item) || 0;
++cnt;
this.set(item, cnt);
}
}}function containsAll(...allArrays) {
let cntObj = new MapCnt();
for (array of allArrays) {
cntObj.cnt(array);
}
// now see how many items have the full cnt
let output = [];
for (var [item, cnt] of cntObj.entries()) {
if (cnt === allArrays.length) {
output.push(item);
}
}
return(output);} var result = containsAll.apply(this, arrays);document.body.innerHTML = "<pre>[<br> " + result.join(',<br> ') + "<br>]</pre>";