【问题标题】:Get an array with non duplicate values from multiple array从多个数组中获取具有非重复值的数组
【发布时间】:2018-07-05 23:06:00
【问题描述】:

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

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

结果应该是这样的:

[1,3,4];

【问题讨论】:

标签: javascript arrays typescript


【解决方案1】:

您可以使用 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] Type 'Set' is not an array type.'
  • @Adam 你没有标记这个 TypeScript
【解决方案2】:

您可以遍历所有键,然后遍历数组:

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/

【讨论】:

    【解决方案3】:

    您可以将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)

    【讨论】:

      【解决方案4】:

      您可以使用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)

      【讨论】:

        【解决方案5】:

        如果对象来自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) )

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-01
          • 1970-01-01
          • 2016-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-03
          • 2021-07-24
          相关资源
          最近更新 更多