【问题标题】:Filter Array of Arrays in JavaScript to become unique [duplicate]过滤JavaScript中的数组数组以变得唯一[重复]
【发布时间】:2020-08-11 16:59:28
【问题描述】:

这就是我将如何过滤一组数字以使其变得唯一:

const unique = (value, index, self) => {
  return self.indexOf(value) === index
}

const costs = [10, 8, 5, 5, 8, 7]
const uniqueCosts = costs.filter(unique)

console.log(uniqueCosts) // [10,8,5,7]

我怎样才能过滤一个数组是唯一的:
arr = [[10,10],[8,8],[5,5],[5,5],[8,8],[7,7]]
-> uniqueArr =[[10,10],[8,8],[5,5],[7,7]]

我已经研究过创建一个新的Set(),它在一个简单的数组中也能很好地工作,但是集合的.add 函数似乎将一个数组添加到集合中,即使该数组已经在集合中。

任何帮助将不胜感激,我正在寻找一个简单的解决方案,使用 JavaScript 中现有函数的强大功能,而不涉及 for/while 循环。

非常感谢!

【问题讨论】:

  • 你可以使用 .flat 将其展平,然后使用相同的
  • 取决于你想要什么样的独特性。请显示预期的输出。我假设您正在检查数组是否相等,是吗?
  • arr = [[10,10],[8,8],[5,5],[5,5],[8,8],[7,7]] 的预期结果是什么?
  • @ggorlen, @hev1 这是预期的结果uniqueArr =[[10,10],[8,8],[5,5],[7,7]]
  • @HarmandeepSinghKalsi 谢谢,但我想保持嵌入式阵列的结构,但是平坦会失去它,对吗?

标签: javascript arrays filter


【解决方案1】:

您可以使用带有序列化函数的Set 来获取没有不同对象引用的字符串。

const
    serialize = v => JSON.stringify(v),
    unique = array => array.filter((s => v => (t => !s.has(t) && s.add(t))(serialize(v)))(new Set));

console.log(unique([10, 8, 5, 5, 8, 7]));
console.log(unique([[10, 10], [8, 8], [5, 5], [5, 5], [8, 8], [7, 7]]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    猜你喜欢
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多