【问题标题】:How to compare 2 arrays for same value and save them to 3rd array with true or false flags如何比较 2 个数组的相同值并将它们保存到带有真或假标志的第三个数组
【发布时间】:2021-02-08 06:17:21
【问题描述】:

我有 2 个数组:

var arr1 = [{name:"Option1"},{"name":"Option2"},{"name":"Option3"},{"name":"Option4"},{"name":"Option5"},{"name":"Option6"},{"name":"Option7"},{"name":"Option8"},{"name":"Option9"},{"name":"Option10"}]

var arr2 = [{"name": "Option 2"},{"name": "Option 4"},{"name": "Option 6"},{"name": "Option 8"},{"name": "Option 10"}]

我希望实现的是第三个数组,其中包含来自 arr1 的所有值以及 "marked":true 的附加标志,如果该值在 arr2 ELSE "marked" 中找到:错误

我尝试了各种 arry 方法的组合,例如 map()、filter()、forEach(),但不知何故无法弄清楚如何在不重复值或重复条目的情况下正确返回。

** 我看到的是,我的内部和外部循环都执行了两个语句,我不知何故错过了返回真/假逻辑,最终重复我的循环的次数等于 arr2 的长度。 **

function test() {
  var arr1 = [{
      name: "Option1"
    },
    {
      "name": "Option2"
    },
    {
      "name": "Option3"
    },
    {
      "name": "Option4"
    },
    {
      "name": "Option5"
    },
    {
      "name": "Option6"
    },
    {
      "name": "Option7"
    },
    {
      "name": "Option8"
    },
    {
      "name": "Option9"
    },
    {
      "name": "Option10"
    }
  ]
  var arr2 = [{
      "name": "Option2"
    },
    {
      "name": "Option4"
    },
    {
      "name": "Option6"
    },
    {
      "name": "Option8"
    },
    {
      "name": "Option10"
    }
  ]
  arr1.forEach((el) => {
    arr2.forEach((el2) => {
      if (el.name.toString() === el2.name.toString()) {
        return console.log("Printing from inside the if loop", el)
      }
      console.log("Printing from outside the if loop", el)
    })
  })
}
test()

【问题讨论】:

    标签: javascript node.js arrays multidimensional-array


    【解决方案1】:

    首先将 arr2 中的所有比较值(名称)映射到 Set

    然后映射arr1 以创建新数组并在 arr2 Set 中查找每个名称

    const arr2Names = new Set(arr2.map(e => e.name));
    
    const res = arr1.map(e => ({...e, marked: arr2Names.has(e.name)}));
    
    console.log(res)
    <script>
    var arr1=[{name:"Option1"},{name:"Option2"},{name:"Option3"},{name:"Option4"},{name:"Option5"},{name:"Option6"},{name:"Option7"},{name:"Option8"},{name:"Option9"},{name:"Option10"}],
    arr2=[{name:"Option2"},{name:"Option4"},{name:"Option6"},{name:"Option8"},{name:"Option10"}];
    </script>

    【讨论】:

    • 这就像一个魅力。只需用 5k+ 条记录的实际数据对其进行测试,然后将其整理出来就可以了
    • set.has() 返回一个布尔值(参见链接中的文档)。新对象通过原始对象的一些“解构” 完成并向其添加新属性markedmap() 基于迭代另一个数组创建一个新数组
    • 它的失败效率很高,因为您只对每个数组进行一次迭代,并且 Set 查找是 O(1) 复杂度
    • 是的,感谢参考链接非常有帮助,我在我的 atcual 代码中注意到的一件事是,结果是一个充满承诺的数组,任何关于为什么我知道它与问题无关的想法但是出现在答案 SnapShot { '$__': InternalCache {strictMode: true, .... }, isNew: false, errors: undefined, '$locals': {}, '$op' : null, _doc: { .... }, '$init': true, 匹配: true }
    • 取决于您用来获取数据的任何 api/sdk。如果您遇到问题,请开始一个新问题。这个问题不是为此设置的
    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多