18 条回复  ·  518 次点击
Sawyerhou 小成 2024-6-18 10:04:39
用带顺序的集合试试?顺序控制自建一个比较函数,或者加个序号,然后直接求差集、交集。
EchoWhale 小成 2024-6-18 10:07:55
已经是 O(n)了, 真的还能有更好的吗?
chihiro2014 小成 2024-6-18 10:21:34
这和我做的一个表格表头同步的需求很像
oamu 小成 2024-6-18 11:36:03
``` JavaScript
// 返回用 arr2 中的对象更新 arr1 后的数组,数组按 arr2 中相对顺序排序
function merge(arr1, arr2) {
  const map = new Map();
  const ans = [];
  arr1.forEach((obj) => map.set(obj.id, obj));
  arr2.forEach((obj) => {
    if (map.has(obj.id)) {
      ans.push(obj);
      map.delete(obj.id);
    }
  });
  return ans.concat(Array.from(map.values()));
}
```
ZztGqk 小成 2024-6-18 12:54:38
整两个 set 做交并补吧
chendl111 初学 2024-6-18 16:43:13
需求目的就是把 arr1 的元素复制到 arr2 并且删除 arr1 没有的元素。
那么对两个数组分别 set ,找出差集,双指针扫一遍,复杂度 Onlogn
Marthemis 小成 2024-6-18 17:27:19
感觉优化的空间不是很大。

```js
const map1 = new Map()
const map2 = new Map()
arr1.forEach(e => {
  map1.set(e.key, e)
});
arr2.forEach(e => {
  if (map1.has(e.key)) {
    map2.set(e.key, e)
  }
});
arr1.forEach(e => {
  if (!map2.has(e.key)) {
    map2.set(e.key, e)
  }
});
console.log(map2.values())
```
xiangyuecn 初学 2024-6-18 17:51:30
// 写了一段 兼容 IE6 🐶
// 只存在一次两层循环
// 循环的过程中重新建 2 个数组,数组里面放新的对象,对象里面把原始值存进去,加个计数值

var arr1=["a","b","c","d","e","f","a","b","a","b"] //字符串意思意思,代替相同的对象
var arr2=["a","b","c","c","c","c","z","z","z","a"]
var arr11=[],arr22=[];

for(var i=0;i<arr1.length;i++){
        arr11.push({value:arr1, hit:0});
}
for(var i=0;i<arr2.length;i++){
        var obj2={value:arr2, hit:0};
        arr22.push(obj2);
        for(var j=0;j<arr11.length;j++){ //给 arr11 计数
                var obj1=arr11[j];
                if(obj1.value==obj2.value){ //自行比较两个对象是否相等
                        obj1.hit++;
                        obj2.hit++;
                }
        }
}

//得到已存在的结果
arr2.length=0; //?
for(var i=0;i<arr22.length;i++){
        if(arr22.hit){
                arr2.push(arr22.value);
        }
}
//添加缺失的
for(var i=0;i<arr11.length;i++){
        if(!arr11.hit){
                arr2.push(arr11.value);
        }
}

console.log(arr2);
YuJianrong 小成 2024-6-19 00:04:57
@FishBear 作为作者,我要说明一下 fast-array-diff 不是用在这个场景的。
fast-array-diff 是为了找出一个有序系列转换到另一个有序系列的步骤。
这个问题的场景是无序的。
1835407125 初学 2024-6-19 14:30:47
已经 O(n)了,要是排序好的数组,应该还能优化
12
返回顶部