【问题标题】:Most Efficient way to Combine Arrays removing Duplicates组合数组删除重复项的最有效方法
【发布时间】:2018-04-02 19:39:51
【问题描述】:

使用 Flatlist 并寻找一种有效的方法来组合列表的元素,同时删除重复的元素。每个元素都有一个唯一的键值,可以知道它是否重复。

我目前的实现使用了 concat 函数:

Array.prototype.unique = function() {
      var a = this.concat();
      for(var i=0; i<a.length; ++i) {
          for(var j=i+1; j<a.length; ++j) {
              if(a[i].key === a[j].key)
                  a.splice(j--, 1);
          }
      }
      return a;
  };

const OldArray = this.state.data;
const NewArray = [] //contains values we loaded in 
const FinalArray = OldArray.concat(NewArray).unique();

//Update the State
this.setState({
   data: FinalArray
)}

这确实有效,但每次运行此函数时,它的效率至少为 N^2,这似乎很糟糕。有一个更好的方法吗?我觉得应该有..

【问题讨论】:

    标签: javascript arrays algorithm sorting react-native


    【解决方案1】:

    您可以使用 Array#reduce 创建唯一值的 Map,然后将其传播回数组。这将使您第一次出现具有相同键的对象。

    const union = (arr1, arr2, key) => [... // spread to an array
      arr1.concat(arr2) // concat the arrays
      .reduce((m, o) => m.has(o[key]) ? m : m.set(o[key], o), new Map) // reduce to a map by value of key
      .values()]; // get the values iterator
    
    const OldArray = [{ a: 1, v: 1 }, { a: 2 }]
    const NewArray = [{ a: 1, v: 100 }, { a: 3 }]
    const FinalArray = union(OldArray, NewArray, 'a')
    
    console.log(FinalArray);

    @4castle 建议的另一个选项是使用 Array#map 来初始化 Map。但是,这将采用具有相同键的对象的最后一次出现。在初始化 Map 之前,您始终可以 Array#reverse 数组。

    const union = (arr1, arr2, key) => [... // spread to an array
      new Map(arr1.concat(arr2).map(o => [o[key], o])) // concat and initialize the map
      .values()]; // get the values iterator
    
    const OldArray = [{ a: 1, v: 1 }, { a: 2 }]
    const NewArray = [{ a: 1, v: 100 }, { a: 3 }]
    const FinalArray = union(OldArray, NewArray, 'a')
    
    console.log(FinalArray);

    【讨论】:

    • new Map(arr1.concat(arr2).map(o =&gt; [o[key], o])) 也可用于创建Map
    • 确实如此。但是,有一点需要注意。查看更新的答案。
    猜你喜欢
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2022-01-22
    • 2010-12-04
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多