数组双重遍历

 

问题描述:

var arr1 = [{
        id: 1,
        name: 'a'
    }, {
        id: 2,
        name: 'b'
    }, {
        id: 3,
        name: 'c'
    }, {
        id: 4,
        name: 'd'
    }, {
        id: 5,
        name: 'e'
    }, {
        id: 6,
        name: 'f'
    }];
        
    var arr2 = [{
        id: 1,
        name: 'a'
    }, {
        id: 4,
        name: 'd'
    }, {
        id: 7,
        name: 'g'
    }];

两个数组 arr1arr2 求他们中 id 相同的项。有什么最优的方案吗?


 

第 1 个答案:

这个完全不需要数组双重遍历,一次遍历就够了。复杂度完全可以做到:

O = arr1.length + arr2.length + min(arr.length, arr2.length);

我的方案如下:

const [minArr, maxArr] = arr1.length > arr2.length ? [arr2, arr1] : [arr1, arr2];
const tempMaxArrObj = {};
maxArr.map(item => tempMaxArrObj[item.id] = item);  // m 的复杂度
minArrIdArr = minArr.map(item => item.id);    // n 的复杂度
const result = [];
minArrIdArr.map((id) => tempMaxArrObj[id] && result.push(tempMaxArrObj[id])); // min(m, n) 的复杂度。

 

第 2 个答案:

const concatArr = [...arr1, ...arr2]
const hash = {}
concatArr.forEach(obj => {
  if (hash[obj.id]) {
    // 这里就得到了两个的 name 值:
    console.log(obj.name, hash[obj.id])
  } else {
    hash[obj.id] = obj.name
  }
})

 

第 3 个答案:

提供一个用 Set 求交集的方法:

arr1 = new Set(arr1.map(i => i.id));
arr2 = new Set(arr2.map(i => i.id));
let intersectionSet = new Set([...arr1].filter(x => arr2.has(x)));
console.log(intersectionSet);

 

第 4 个答案:

  for(var i = 0 ; i<arr1.length;i++){
        for(var j = 0 ; j<arr2.length;j++){
            if(arr1[i].id===arr2[j].id){
                console.log(arr1[i].name,arr2[j].name);
            }
        }
    }

 

第 5 个答案:

loadash intersection :

_.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
// => [{ 'x': 1 }]

参考,内部代码应该也是双重便利。 https://lodash.com/docs/4.17.4


 

第 6 个答案:

两个数组里面的项的id是递增的吗?


尝试了用clipboard.js,但是需要点击按钮触发,自动执行点击事件也无效<button class="btn" data-clipboard-text="测试的文本">复制&l ...