在javascript中从嵌套数组获取uniq值的更快方法

在javascript中从嵌套数组获取uniq值的更快方法,javascript,Javascript,这是一项检查,以确保我没有使我的程序变得过于复杂。我有一些代码可以找到子节点,按标记名过滤,然后获取它们的数据属性。这一切都很顺利 但是,数据属性中存在重复项,因此必须使用唯一值对其进行筛选。因此,我再次映射并推送到一个新列表,只要它们还没有在那里 我看到的问题是,这会在循环中创建一个嵌套循环,可能会减慢速度。有没有更快的方法 请注意,我不是在征求你对这里最好的东西的意见。我只是想知道是否有更快的选择 var productList = Array.from(document.querySe

这是一项检查,以确保我没有使我的程序变得过于复杂。我有一些代码可以找到子节点,按标记名过滤,然后获取它们的数据属性。这一切都很顺利

但是,数据属性中存在重复项,因此必须使用唯一值对其进行筛选。因此,我再次映射并推送到一个新列表,只要它们还没有在那里

我看到的问题是,这会在循环中创建一个嵌套循环,可能会减慢速度。有没有更快的方法

请注意,我不是在征求你对这里最好的东西的意见。我只是想知道是否有更快的选择

  var productList = Array.from(document.querySelectorAll(".grid li"))

  var _productList = productList.map(function (item) {
    var a = Array.from(item.children)
    var b = a.filter(item => item.tagName == "SPAN").map(item => item.dataset.colors)
    let newList = []
    b.map(i => !newList.includes(i) && newList.push(i))
    return newList
  })

  console.log(_productList)
// 0: (2) ["yellow", "white"]
// 1: ["gray"]
// 2: ["white"]
// 3: ["white"]
// 4: ["light_brown"]
// 5: (2) ["beige", "white"]
// 6: ["blue"]
// 7: (2) ["burgandy", "White"]

这里有一个解决方案,让javascript为您完成工作

let value=[“1”、“2”、“2”、“3”、“3”、“3”];
设distinctValues={};
for(让值的值){
//Javascript的对象实际上是映射,映射本身具有唯一的键。
//因此,我们可以将所有值放入对象中,并让javascript处理重复数据消除。
distinctValues[值]=空;
}
for(让distinctValue中的distinctValue){
//这仅打印不同的值(1、2、3)
console.log(distinctValue);

}
一种优化方法是使用
Set
s,而不是创建自定义逻辑来过滤重复项

通过这样做,您可以将过滤控制权交给浏览器的JS引擎,它可能会更快(或者至少不会更慢):

var productList=Array.from(document.queryselectoral(“.grid li”))
var\u productList=productList.map(项=>[
…新的一套(
排列
.来自(项目.子项)
.filter(item=>item.tagName==“SPAN”)
.map(item=>item.dataset.colors)
)
])
console.log(_productList)

最好使用
b.forEach()。愚蠢的错误。。但问题依然存在。这个嵌套循环,forEach没有映射对吗,但这是标准做法吗?或者有没有一种没有嵌套循环的更快的方法呢?你可以不用嵌套循环就可以了,这能回答你的问题吗?如果说有什么东西让这一切变慢了,那就是DOM访问。最好将数据与DOM分离,这样就不必基于DOM查询执行此类操作。我认为这是提供的最干净的解决方案。谢谢FZsOr:
const distinctValues=新集合(值)?@vivekmaharah此解决方案需要两个循环;它还将迭代对象的固有类型,如果有任何可重用的属性,它也将列出它们。OP要求更快的方法,但这可能比他们的更慢。尽管有两个循环,但这是一个线性O(n)解决方案,因为循环不是嵌套的。原始代码为O(n^2),因为数组枚举发生在另一个数组枚举内。使用集合的答案是cleaner tho。我不知道Set在浏览器中得到如此广泛的支持,所以我很高兴OP采用了这种方法:)