假如有这样一个数组,要求找出数组两两之间name相同的元素,并标记其所在数组的索引。
var arr = [[{name:'Keith'},{name:'Annie'},{name:'Joy'},{name:'Eddie'},],[{name:'Keith'},{name:'Allen'},{name:'Bob'},{name:'Candy'},],[{name:'David'},{name:'Annie'},{name:'France'},{name:'Green'},],[{name:'Hellon'},{name:'Jack'},{name:'France'},{name:'Lily'},]
]
开始想到的笨方法就是数组两两遍历,但当数据量大的时候,这种方法的效率是极其低的,于是思考,如何能在遍历一次的情况下,实现这个功能。
var obj = {};
arr.forEach((arr1,index) => {arr1.forEach((item, idx) => {var idxArr = obj[item.name];if (idxArr) {console.log('第'+index+'个数组的第'+idx+'个元素',item)console.log('与第'+idxArr[0]+'个数组的第'+idxArr[1]+'个元素相同')}else{// 记录name第一次出现的索引obj[item.name] = [index, idx]}})
})
如上,只遍历一次,可以记录下所有重复出现过的元素和索引。哪怕是维度再多的数组,也可以通过这样的方式通过一次遍历实现去重。
当感觉一个问题复杂的时候,换个角度思考,说不定就会有简单的解决办法。