Pendekatan lain yang diindeks dapat memproses sejumlah array sekaligus:
// Calculate intersection of multiple array or object values.
function intersect (arrList) {
var arrLength = Object.keys(arrList).length;
// (Also accepts regular objects as input)
var index = {};
for (var i in arrList) {
for (var j in arrList[i]) {
var v = arrList[i][j];
if (index[v] === undefined) index[v] = 0;
index[v]++;
};
};
var retv = [];
for (var i in index) {
if (index[i] == arrLength) retv.push(i);
};
return retv;
};
Ini hanya berfungsi untuk nilai yang dapat dievaluasi sebagai string dan Anda harus meneruskannya sebagai array seperti:
intersect ([arr1, arr2, arr3...]);
... tetapi secara transparan menerima objek sebagai parameter atau sebagai salah satu elemen yang akan berpotongan (selalu mengembalikan array nilai-nilai umum). Contoh:
intersect ({foo: [1, 2, 3, 4], bar: {a: 2, j:4}}); // [2, 4]
intersect ([{x: "hello", y: "world"}, ["hello", "user"]]); // ["hello"]
EDIT: Saya hanya memperhatikan bahwa ini, sedikit banyak, bermasalah.
Yaitu: Saya mengkodekannya berpikir bahwa input array tidak dapat dengan sendirinya mengandung pengulangan (seperti contoh yang diberikan tidak).
Tetapi jika array input kebetulan mengandung pengulangan, itu akan menghasilkan hasil yang salah. Contoh (menggunakan implementasi di bawah):
intersect ([[1, 3, 4, 6, 3], [1, 8, 99]]);
// Expected: [ '1' ]
// Actual: [ '1', '3' ]
Untungnya ini mudah diperbaiki dengan hanya menambahkan pengindeksan tingkat kedua. Itu adalah:
Perubahan:
if (index[v] === undefined) index[v] = 0;
index[v]++;
oleh:
if (index[v] === undefined) index[v] = {};
index[v][i] = true; // Mark as present in i input.
...dan:
if (index[i] == arrLength) retv.push(i);
oleh:
if (Object.keys(index[i]).length == arrLength) retv.push(i);
Contoh lengkap:
// Calculate intersection of multiple array or object values.
function intersect (arrList) {
var arrLength = Object.keys(arrList).length;
// (Also accepts regular objects as input)
var index = {};
for (var i in arrList) {
for (var j in arrList[i]) {
var v = arrList[i][j];
if (index[v] === undefined) index[v] = {};
index[v][i] = true; // Mark as present in i input.
};
};
var retv = [];
for (var i in index) {
if (Object.keys(index[i]).length == arrLength) retv.push(i);
};
return retv;
};
intersect ([[1, 3, 4, 6, 3], [1, 8, 99]]); // [ '1' ]