解析数组数组并返回公共交集

时间:2019-06-17 22:16:13

标签: javascript arrays

我有一个像这样的数组

    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))

4 个答案:

答案 0 :(得分:4)

您还可以将SetArray.filterArray.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]))] )