【问题标题】:The most efficient way to compare object's property in two arrays比较两个数组中对象属性的最有效方法
【发布时间】:2017-11-17 16:26:06
【问题描述】:

如果一个数组中的一个对象的属性在另一个数组中相同并返回值,我需要检查 Angular2。有没有更有效的方法来做到这一点,或者可能类似于 Swift 中的.contains

doSomething(){
    for (let element1 of array1) {
        for (let element2 of array2) {
            if (element1.id == element2.id) {
                return Observable.fromPromise(element2);
            }
        }
    }
}

编辑:

我必须订阅这个值,因为我正在从数据库中加载值(在 fromPromise 中):

this.doSomething().subscribe(id => {
...
}

【问题讨论】:

    标签: arrays angular object for-loop


    【解决方案1】:

    在处理数组时,使用高阶方法通常更具可读性;
    在您的情况下,您可以使用some 通过内部数组返回的filter 外部数组,然后map 它:

    array2.filter( x =>
      array1.some( z => z.id == x.id )
    ).map(x => Observable.fromPromise(x) )
    

    【讨论】:

    • @maionam 这很有意义,但是当我想返回这个值并且我在不同的地方订阅这个函数时this.doSomething().subscribe 我得到了Property 'subscribe' does not exist on type 'Observable<{}>[];
    • 我给你的例子是处理数组时的一般做法,如果你有一个不起作用的特定情况,你应该试着做一个小提琴;如果你让我知道,我会看看
    • 我稍微更新了一个问题,我需要返回 Observable 来订阅它。
    • 用 map 你返回一个数组,我想你正在寻找里面的元素,试试this.doSomething()[0].subscribe
    • 如果你只想要一个元素,你也可以使用array.find
    【解决方案2】:

    array1array2 的交集: array1.filter((item) => array2.includes(item));

    【讨论】:

    • 这肯定是聪明的代码,但它不能回答问题。在 OP 中,数组包含对象,作者需要通过 id 属性来比较它们。因此过滤不会按预期工作,因为 array2.includes(item) 将始终为不同的对象返回 false,即使它们具有相同的 id
    【解决方案3】:

    === 用于比较 id 的值

       for (const element1 of array1) {
          for (const element2 of array2) {
            if (element1.id === element2.id) {
              return Observable.fromPromise(element2);
            }
          }
        }
    

    如果您想知道属性调用 id 是否存在于两者中

    for (const element1 of array1) {
     Object.keys(element1).forEach(key => {
          if(key === 'id') {
              for (const element2 of array2) {
                if (element2.hasOwnProperty(key)) {
                  return Observable.fromPromise(element2);
                }
              }
            }
          }
       }
    

    【讨论】:

      【解决方案4】:

      这是一个例子

      array1 = [1,2,4,5,6]
      array2 = [3,4,2,6]
      array1.filter(a1=> array2.includes(a1)) //To print matching results
      array1.filter(a1=> array2.includes(a1)).length == array1.length ? true:false //to validate similarity
      

      【讨论】:

      • 这对 OP 没有帮助。问题中的数组包含对象,OP需要找到array2中的哪个对象在array1中具有相同id属性的对象,然后发出array2中匹配对象的Observable
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多