javascript - 组合数组删除重复项的最有效方法

标签 javascript arrays algorithm sorting react-native

使用 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,这看起来很糟糕。有一个更好的方法吗?我感觉一定有..

最佳答案

您可以使用 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);

关于javascript - 组合数组删除重复项的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46869330/

相关文章:

javascript - HTML5 富应用程序 : a way to deliver printable reports

javascript - 想要在检测到移动设备时使用 javascript 将菜单 url 转换为 #

javascript - 递归目录搜索,包括 ZIP 和 RAR 内的文件

使用交换函数和指针的 C++ 冒泡排序

algorithm - 基于人工智能的卡牌对战游戏

Javascript 正则表达式对象

python - 有没有一种更快的方法使用 numpy 中的矢量化操作从大型二维数组中恢复图像

我可以使用 char[] 或 char* 作为函数的返回值吗?

algorithm - 何时使用 dsgesv 与 dgesv 来求解线性方程组

c# - 需要添加2个数字的代码