一道关于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题目,能收藏下
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 一道关于js数组取相同元素的笔试题
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 一道关于js数组取相同元素的笔试题