从多个数组中获取一个不包含重复值的数组

6

我需要遍历多个数组并创建一个新的数组,其中包含多个数组中的所有值但没有重复项,是否有任何插件/快速方法可以做到这一点?

var x = {
  "12": [3, 4],
  "13": [3],
  "14": [1, 4]
};

结果应该看起来像这样:
[1,3,4];

请使用代码片段编辑器创建一个 [mcve],展示您的努力和代码。 - mplungjan
1
可能是如何在Javascript中获取两个数组之间的差异?的重复问题。 - Heretic Monkey
[...new Set([].concat.apply([], Object.values(x)))] - Seraf
5个回答

3
你可以使用ES6扩展语法和Object.values方法来实现这一点。

var x = {
  "12": [3, 4],
  "13": [3],
  "14": [1, 4]
}

const result = [...new Set([].concat(...Object.values(x)))]
console.log(result)

使用 Lodash 的解决方案

var x = {
  "12": [3, 4],
  "13": [3],
  "14": [1, 4]
}

const result = _.uniq(_.flatten(_.values(x)))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>


我遇到了这个错误:'[ts] 类型 'Set<any>' 不是数组类型。' - Adam
@Adam,你没有标记这个 TypeScript。 - mplungjan

1
你可以使用 array#fromsetarray#reduce

var x = {"12": [3, 4],"13": [3],"14": [1, 4]};
    result = Array.from(new Set(Object.values(x).reduce((r,a) => r.concat(a), [])));
console.log(result)

你可以从对象中获取所有值,并创建一个新对象,然后从新对象中获取所有键。

var x = {"12": [3, 4],"13": [3],"14": [1, 4]};
    result = Object.keys(Object
                        .values(x)
                        .reduce((r,a) => (a.forEach(v => r[v] = true), r),{})
                        ).map(Number);
console.log(result)


0

你可以循环遍历所有的键和数组:

var outputArray = [];
for (var y in x) {
    for (var z = 0; z < x[y].length; z++) {
        if (outputArray.indexOf(x[y][z]) === -1) {
            outputArray.push(x[y][z]);
        }
    }
}

https://jsfiddle.net/80c8ctuo/


0

您可以使用Object.values获取所有数组,然后使用concat将它们合并成一个数组。接下来,您可以使用filter来删除重复项。

const x = {"12": [3, 4],"13": [3],"14": [1, 4]};
const result = [].concat.apply([], Object.values(x)).filter((el, i, a) => i === a.indexOf(el));
console.log(result)


0

如果对象是通过JSON.parse创建的:

var j = '{ "12": [3, 4], "13": [3], "14": [1, 4] }'

var a = [], x = JSON.parse(j, (k, v) => (a[v] = +v, v))

console.log( a.filter(isFinite) )


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接