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

  • 时间:2018-06-06 01:58 作者:浮生偷闲 来源:浮生偷闲 阅读:851
  • 扫一扫,手机访问
摘要:内容导读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)
最新发布的资讯信息
【系统环境|】2FA验证器 验证码如何登录(2024-04-01 20:18)
【系统环境|】怎么做才能建设好外贸网站?(2023-12-20 10:05)
【系统环境|数据库】 潮玩宇宙游戏道具收集方法(2023-12-12 16:13)
【系统环境|】遥遥领先!青否数字人直播系统5.0发布,支持真人接管实时驱动!(2023-10-12 17:31)
【系统环境|服务器应用】克隆自己的数字人形象需要几步?(2023-09-20 17:13)
【系统环境|】Tiktok登录教程(2023-02-13 14:17)
【系统环境|】ZORRO佐罗软件安装教程及一键新机使用方法详细简介(2023-02-10 21:56)
【系统环境|】阿里云 centos 云盘扩容命令(2023-01-10 16:35)
【系统环境|】补单系统搭建补单源码搭建(2022-05-18 11:35)
【系统环境|服务器应用】高端显卡再度登上热搜,竟然是因为“断崖式”的降价(2022-04-12 19:47)
手机二维码手机访问领取大礼包
返回顶部