【问题标题】:Node JS array.includes not working as expectedNode JS array.includes 没有按预期工作
【发布时间】:2018-08-16 23:21:37
【问题描述】:

我有以下代码应该从不包含在另一个常量数组中的所有元素中过滤一个动态数组(最多 30 万个元素):

orders[] //  is already filled with data
let materials = [] // create empty array
for (let scheme in schemes) { // loop constant object
    materials.push(schemes[scheme].typeID) // take id and add it to materials array
}
materials = Array.from(new Set(materials)) // filter out duplicates
console.log(materials) // everything looks fine here, 83 unique ids
for (let order in orders) { // now loop the main array
    if (!materials.includes(orders[order].type_id)) { // if order's containment id is not found in materials array
        orders.splice(order,1) // remove it from array
        order -= 1 // and one step back to compensate removed index (do I need it or is it processed normally even after .splice?) 
    }
}
// and send filtered orders into browser when certain url is requested

然而并不是所有不必要的记录都被过滤掉了,有很多很多他们的id在材料数组中找不到。

我的错误是什么,错误在哪里?

【问题讨论】:

  • 你可能想看看Array.prototype.filter()
  • 你知道Array查找是O(n),Set查找是O(1)
  • .. 并且永远不要使用 let scheme in schemes 遍历数组...
  • @str 不,不是。
  • @JonasW。这次迭代有什么问题?

标签: javascript arrays node.js


【解决方案1】:
for (let scheme in schemes) 

这就是你如何迭代对象中的键。而是遍历数组中的条目:

for (let scheme of schemes) 

此外,您应该考虑使用 Set 进行查找,因为它的速度要快得多。 mapfilter 可能有用:

const materials = new Set(schemes.map(scheme => scheme.typeID));

orders = orders.filter(el => materials.has(el.type_id));

【讨论】:

  • 这种方法确实有效,而且速度快如闪电。 1 秒对 1 分钟的原始代码。
  • @arctomachine 很高兴为您提供帮助 :)
猜你喜欢
  • 2016-12-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2020-03-18
相关资源
最近更新 更多