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

  • 时间:2018-06-06 01:58 作者:浮生偷闲 来源:浮生偷闲 阅读:151
  • 扫一扫,手机访问
摘要:内容导读OK,现在运行结果正确,但是这道题真的就是这么简单吗 ?上面运行正确的前提是数组元素都是值类型,假如是引使用类型呢?假如两个引使用类型的属性和值都相同 此处也认为是相同元素,且引使用类型的属性值仍然可可以还是一个引使用类型,所以,在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' &amp;&amp; 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题目,能收藏下

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】你是HTML 5的一员吗?(2019-08-15 11:58)
【系统环境|】Web前端基础怎么学?html、css、JavaScript 知识架构图(2019-08-14 17:55)
【系统环境|】零基础小白走Web前端之路是否可行?答案是yes!(2019-08-13 11:44)
【系统环境|】你知道Web前端与HTML5技术的区别吗?(2019-08-12 14:10)
【系统环境|】移动前端开发和web前端开发的区别(2019-08-11 16:49)
【系统环境|】给新手的锦囊:Web前端开发小白的学习建议和路线图(2019-08-10 16:34)
【系统环境|】都说web前端开发薪资高,入行就有上万月薪,转行难吗?(2019-08-09 14:55)
【系统环境|】干货教程 | Web前端开发学习入门指南(2019-08-08 18:27)
【系统环境|】前端开发:vue路由之前端路由的原理(2019-08-07 13:17)
【系统环境|】你不知道的web前端那些事(2019-08-06 12:29)
手机二维码手机访问领取大礼包
返回顶部