js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的
题目:
给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致。

假设已经写好了Array.prototype.sameStructureAs ,会有下面的结果:
[1,1].sameStructureAs([2,2])
// true [1,[1,1]].sameStructureAs([2,[2,2]])
// true [1,[1]].sameStructureAs([[2],2])
// false [[],[]].sameStructureAs([[],[]])
// true
看到上面的代码返回值,或许你就明白了。sameStructureAs方法的功能就如此之简单。
那么, 该怎么实现呢,如下:
Array.prototype.sameStructureAs = function (other) {
// Return 'true' if and only if 'other' has the same
// nesting structure as 'this'.
// Note: You are given a function isArray(o) that returns
// whether its argument is an array.
if (! (other instanceof Array) ) return false; // 传入的不是数组返回false
// 这个函数返回一个序列号
function count (arr) {
// 第一次调用添加一个index属性
if (typeof count.index === 'undefined') {
count.index = 0
}
var resStr = '' // 返回的序列号
if (!arr.length) resStr += count.index // 如果传入数组为空,序列号为当前index属性值
for (var i = 0; i < arr.length; i++) {
if (typeof arr[i] !== 'object') {
resStr += count.index // 如果这个元素不是数组,序列号为当前index属性值
} else {
count.index++ // 将index属性值+1,是为了进入下一层数组
resStr += count(arr[i]) // 返回当前传入数组的序列号
count.index-- //这里 -1 是回到当前层次中,继续遍历
}
}
return resStr
}
return count(this) === count(other)
}
思路是这样的:
因为这仅仅判断数组,并没有其他引用类型的对象,如RegExp、Date等,所以就容易多了。
我先设定数组第一层的非数组元素的序列号为0 ,也就是说 [1,1,1] 序列号是 [0,0,0],因此返回的数组序列号为'000',同样[2,2,2]也返回'000'
每进入一层数组前,那么元素序列号就 +1,该循环完成并返回值后,元素序列号 - 1, 回到当前层次的数组中继续遍历。
注: 如果当前数组为空,数组序列号应该为当前数组层次,这是为了判断在所有元素师空数组时的情况。如[[],[]]返回'11'、[[[],[]]]返回'22'。
js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的的更多相关文章
- JS合并两个数组的方法
JS合并两个数组的方法 我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况.比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合 ...
- JS取出两个数组的不同或相同元素
JS合并两个数组的方法 我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况.比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合 ...
- 给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。
题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数. 解题思路: 首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt] ...
- JS 比较两个数组是否相等 是否拥有相同元素
Javascript怎么比较两个数组是否相同?JS怎么比较两个数组是否有完全相同的元素?Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都 ...
- 探讨JS合并两个数组的方法
我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况. 比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合并成一个.方法如下: ...
- 转:探讨JS合并两个数组的方法
我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况. 比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合并成一个.方法如下: ...
- JS比较两个数组是否相等 是否拥有相同元素
Javascript怎么比较两个数组是否相同?JS怎么比较两个数组是否有完全相同的元素?Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都 ...
- [转] 探讨JS合并两个数组的方法
我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况. 比如: 1 2 var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合并成一个.方法 ...
- js 合并两个数组对象
项目背景是合并a = [{name:'dede'},{name:'jenny'}], b = [{age:18},{age:19}] 合并成[{name:'dede',age:18},{name: ...
随机推荐
- 【疯狂造轮子-iOS】JSON转Model系列之一
[疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...
- 说说Makefile那些事儿
说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- 如何避免git每次提交都输入密码
在ubuntu系统中,如何避免git每次提交都输入用户名和密码?操作步聚如下:1: cd 回车: 进入当前用户目录下:2: vim .git-credentials (如果没有安装vim 用其它编辑器 ...
- ASP.NET 5 RC1 升级 ASP.NET Core 1.0 RC2 记录
升级文档: Migrating from DNX to .NET Core Migrating from ASP.NET 5 RC1 to ASP.NET Core 1.0 RC2 Migrating ...
- Windows下Visual studio 2013 编译 Audacity
编译的Audacity版本为2.1.2,由于实在windows下编译,其源代码可以从Github上取得 git clone https://github.com/audacity/audacity. ...
- atitit.管理学三大定律:彼得原理、墨菲定律、帕金森定律
atitit.管理学三大定律:彼得原理.墨菲定律.帕金森定律 彼得原理(The Peter Principle) 1 彼得原理解决方案1 帕金森定律 2 如何理解墨菲定律2 彼得原理(The Pete ...
- WebAPI
WebAPI的Host OWIN IIS WebAPI 的handler和Filter有啥区别? WebAPI 常用 Filters Exception Filter Timer Filter Lo ...
- appium+robotframework环境搭建
appium+robotframework环境搭建步骤(Windows系统的appium自动化测试,只适用于测试安卓机:ios机需要在mac搭建appium环境后测试) 搭建步骤,共分为3部分: 一. ...
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...