我有一个像这样的数组
arrays = [
['a', 'b', 'c', 'd'],
['a', 'b', 'c', 'g'],
['a', 'b', 'c', 'g', 'x'],
]
我需要形成所有交叉点的一个数组。这样。
function get_intersects(arrays) {
// return all intersections
return ['a', 'b', 'c', 'g'];
}
请注意,即使g
并非全部返回,但至少有两个都返回了。
这是我的尝试,但g
丢失了。
arrays = [
['a', 'b', 'c', 'd'],
['a', 'b', 'c', 'g'],
['a', 'b', 'c', 'g', 'x'],
]
function get_intersects(arrays) {
return arrays.shift().filter(function (v) {
return arrays.every((a) => a.indexOf(v) !== -1 );
});
}
console.log(get_intersects(arrays))
答案 0 :(得分:4)
您还可以将Set与Array.filter和Array.lastIndexOf结合使用:
let data = [ ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'g'], ['a', 'b', 'c', 'g', 'x'] ]
let result = [...new Set(data.flat().filter((x,i,a) => a.lastIndexOf(x) != i))]
console.log(result)
答案 1 :(得分:3)
如果您的目标是确定单个字母是否在至少两个数组中,则可以对它们进行计数。尚不清楚内部数组是否可以像['a', 'b', 'c', 'g', 'x', 'x']
这样重复。假设这些表示集合并且不会重复成员,则只需对计数大于一个的任何事物进行计数和过滤即可。
var arrays = [
['a', 'b', 'c', 'g'],
['a', 'b', 'c', 'd'],
['a', 'b', 'c', 'g', 'x'],
]
var counts = arrays.reduce((counts, arr) => {
arr.forEach(c => counts[c] = (counts[c] || 0) + 1)
return counts
}, {})
let common = Object.keys(counts).filter(k => counts[k] > 1)
console.log(common)
如果可以进行重复,则可以在重复和计数之前使用一组使其唯一。像这样:
new Set(arr).forEach(c => counts[c] = (counts[c] || 0) + 1)
答案 2 :(得分:2)
在遍历数组时,可以使用辅助数组放置访问过的值。
const arrays = [
['a', 'b', 'c', 'd'],
['a', 'b', 'c', 'g'],
['a', 'b', 'c', 'g', 'x'],
];
const magic = arrays => {
const values = [];
const res = [];
arrays.forEach(array => {
array.forEach(e => {
// if the current value has been visited and is not yet inserted into result array
if (values.indexOf(e) !== -1 && res.indexOf(e) === -1) res.push(e);
// if the current value hasn't been visited yet
if (values.indexOf(e) === -1) values.push(e);
});
});
return res;
};
console.log(magic(arrays));
答案 3 :(得分:1)
排序以查找重复项,并在:之后删除重复项:
var arrays = [ ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'g'], ['a', 'b', 'c', 'g', 'x'] ]
console.log( [...new Set(arrays.flat().sort().filter((v, i, a) => v == a[--i]))] )