[javascript]删除指定数组中指定的元素
已知一个数组,我们想用指定的方法对数组中的元素进行逐一操作。
函数如下:
foreach = function (obj, insp){
if(obj== null && obj.constructor != Array){
return [];
}
//obj是要处理的数组,obj==null 表示对象尚未存在;obj.constructor != Array 表示对象obj的属性的构造函数不是数组;
//constructor属性始终指向创建当前对象的构造函数。两个条件均满足,则返回空数组[];
//下面对constructor属性作进一步了解。
var obj= [1, 2, 3, 4]; // 等价于 var obj= new Array(1, 2, 3, 4);
console.log(obj.constructor === Array); // 返回true 表明obj的构造函数为Array;
var foo= function() { }; // 等价于 var foo = new Function();
console.log(foo.constructor === Function); // 返回true 表明foo的构造函数为Function;
var obj = new Foo(); //由构造函数实例化一个obj对象
console.log(obj.constructor === Foo); // 返回true 表明obj的构造函数为Foo;
-----------------------------------------------------------------------------------------------------------
var i=0, len = obj.length, r = [];
while(i<len){
var x = insp(obj[i], i);
if (x !== null) {
r[r.length] = x;
}
i++;
}
return r;
};
//对数组对象obj进行遍历,参数insp代表一个方法或函数,用于对obj中的每个元素进行操作。给参数insp传递了两个参数,obj[i]代表数组中的每一个元素值;并将函数参数insp赋给x,最终将x值赋给数组r。
-----------------------------------------------------------------------------------------------------------
比如我们要遍历数组中的每一个元素,引用foreach函数
var testArray = [1,2,3,4,5,1,2,'w'];
foreach(testArray, function(i){
alert(i)
});
-----------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------
我们用另一个函数来删除指定数组中指定的元素;
ArrayWithout = function(){
if (arguments.length < 2) {
// Arguments 是特殊的对象,代表函数的参数.
return arguments.length == 1 ? arguments[0] : null;
}
var results = [];
var aa = arguments[0];
//将第一参数赋给数组aa;
if (aa === null || aa.constructor != Array) {
return null;
//如果aa不存在或者不是数组,那么返回null;
}
if(arguments[1].constructor == Array){
// 如果第二个参数是数组,则将参数数组中对应的每个元素都删除;
var args = [];
args[0] = aa;
//aa = arguments[0] 将aa赋给数组args,作为其第一个元素值;
foreach(arguments[1], function(v, i){
//引用了函数foreach,来对数组arguments[1]中每个元素进行操作,
args[i+1] = v;
// v代表数组arguments[1]中每个元素值,将它们一一赋值给args[1],args[2]...,而args[0]=arguments[0];
});
}
else{
args = arguments;
//如果第二个参数不是数组,则直接将参数数组赋给args;
}
for(var i = 0;i < aa.length; i ++){
var isWithout = true;
for(var j = 1; j < args.length ; j ++){
if(aa[i] == args[j]){
isWithout = false;
break;
// 切记j是从1开始的,因为args的第一元素args[0]是arguments[0],正是我们要处理的的原数组,等同于数组aa;
让要删除的各个元素与原数组aa中的某一元素进行逐次比较,如果相同,break 跳出循环; isWithout返回false,所以也不再执行下面的 results.push(aa[i]);
}
}
if (isWithout) {
results.push(aa[i]);
//所谓删除原理,就是将原数组各元素与要删除的元素进行比较,保留与要删除的元素不相同的元素并赋给一个新的数组results;
}
}
return results;
//返回已经删除了指定元素的数组;
};
// 引用ArrayWithout的例子
var testArray = [1,2,3,4,5,1,2,'w'];
var result = ArrayWithout(testArray, 1, 3);
//var result = ArrayWithout(testArray, [1, 4]);
alert(result) //[2,4,5,2]
源代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | foreach = function (obj, insp){ if (obj == null && obj.constructor != Array){ return []; } var i=0, len = obj.length, r = []; while (i<len){ var x = insp(obj[i], i); if (x !== null ) { r[r.length] = x; } i++; } return r; }; ArrayWithout = function(){ if (arguments.length < 2) { return arguments.length == 1 ? arguments[0] : null ; } var results = []; var aa = arguments[0]; if (aa === null || aa.constructor != Array) { return null ; } if (arguments[1].constructor == Array){ var args = []; args[0] = aa; foreach (arguments[1], function(v, i){ args[i+1] = v; }); } else { args = arguments; } for ( var i = 0;i < aa.length; i ++){ var isWithout = true ; for ( var j = 1; j < args.length ; j ++){ if (aa[i] == args[j]){ isWithout = false ; break ; } } if (isWithout) { results.push(aa[i]); } } return results; }; var testArray = [1,2,3,4,5,1,2]; foreach (testArray, function(i){ alert(i) }) var result = ArrayWithout(testArray, 1, 3); //var result = ArrayWithout(testArray, [1, 3]); alert(result) //[2,4,5,2] |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?