一道关于js数组取相同元素的笔试题

内容导读

OK,现在运行结果正确,但是这道题真的就是这么简单吗 ?上面运行正确的前提是数组元素都是值类型,如果是引用类型呢?如果两个引用类型的属性和值都相同 此处也认为是相同元素,且引用类型的属性值依然可能还是一个引用类型,所以,在js里就没那么简单,,,这里实际上考查的是引用类型深比较(递归)的知识点。

题目:

返回同时出现在数组a和b的元素,不需要去重

function commonElements(a,b){ // Todo}

第一眼看到这个题目,恩,很简单,然后coding

function commonElements(a, b) { const newArr = []; a.forEach(item => { if (b.includes(item)) { newArr.push(item); } }); return newArr;}// 正确结果应该是[1,2,1,1,1,2]console.log(commonElements([1, 2, 1, 1], [1, 2, 3])); // [1,2,1,1] fail

完事,运行结果不对,发现这里实际上做了去重,但题目不要求去重,OK,继续写

function commonElements(a, b) { const newArr = []; a.forEach(item => { if (b.includes(item)) { newArr.push(item); // 直接不加思考的想着把a,b里相同的两项都push到数组里,不做去重。。。 newArr.push(item); } }); return newArr;}// 正确结果应该是[1,2,1,1,1,2]console.log(commonElements([1, 2, 1, 1], [1, 2, 3])); // [ 1, 1, 2, 2, 1, 1, 1, 1 ] fail

再次fail,这里发现的问题是重复push了b数组的元素,好吧,那就换种方式写

function commonElements(a, b) { const newArr = []; a.forEach(item => { if (b.includes(item)) { newArr.push(item); } }); b.forEach(item => { if (a.includes(item)) { newArr.push(item); } }); return newArr;}// 正确结果应该是[1,2,1,1,1,2]console.log(commonElements([1, 2, 1, 1], [1, 2, 3])); // [ 1, 2, 1, 1, 1, 2 ] success

OK,现在运行结果正确,但是这道题真的就是这么简单吗 ?

上面运行正确的前提是数组元素都是值类型,如果是引用类型呢?如果两个引用类型的属性和值都相同 此处也认为是相同元素,且引用类型的属性值依然可能还是一个引用类型,所以,在js里就没那么简单,,,这里实际上考查的是引用类型深比较(递归)的知识点。

 function commonElements(a, b) { // TODO const newArr = []; a.forEach(item => { if (findSameItemInArr(item, b)) { newArr.push(item) } }) b.forEach(item => { if (findSameItemInArr(item, a)) { newArr.push(item) } }) return newArr;}function findSameItemInArr(item, arr) { return arr.some(_item => compareTwoItem(_item, item))}// 不允许使用JSON.stringify// function compareTwoItem(item1,item2){// return JSON.stringify(item1)===JSON.stringify(item2) // }function compareTwoItem(item1, item2) { if (Object.is(item1, item2)) { return true; } if (typeof item1 === 'object' && typeof item2 === 'object') { if (Array.isArray(item1) || Array.isArray(item2)) { // 数组比较 return compareTwoArray(item1, item2) } else { // 对象比较 return compareTwoObject(item1, item2) } } return false;}function compareTwoArray(arr1, arr2) { if (!Array.isArray(arr1) || !Array.isArray(arr2)) { return false; } if (arr1.length === arr2.length) { for (let i = 0; i < arr1.length; i++) { // 注意此处的递归比较 if (!compareTwoItem(arr1[i], arr2[i])) { return false; } } return true; } return false;}function compareTwoObject(obj1, obj2) { const keyArr1 = Object.keys(obj1); const keyArr2 = Object.keys(obj2); if (keyArr1.length === keyArr2.length) { for (let key of keyArr1) { if (!compareTwoItem(obj1[key], obj2[key])) { return false; } } return true; } return false;}console.log(commonElements([1, 2, 1, 1], [1, 2, 3]));console.log(commonElements([1, { name: 'hh' }], [2, { name: 'hh' }]))console.log(commonElements([1, { a: { name: 'hh' } }], [2, { a: { name: 'hh' } }]))console.log(commonElements([1, [2, 3]], [2, [2, 3]]))console.log(commonElements([1, [2, { name: 'hh' }]], [2, [2, { name: 'hh' }]]))console.log(commonElements([1, [2, { name: 'hh' }]], [2, [3, { name: 'hh' }]]))

一道还不错的js题目,可以收藏下


分享到:


相關文章: