js 数组方法 - 子数组操作 - splice()

splice()方法既可以删除也可以添加数组元素,但会改变原始数组

新数组取值赋值,使用JSON.parse( JSON.stringify(arr)),则不会受旧数组影响

let a=[1,2,3,4], b=JSON.parse(JSON.stringify(a));
a[0]=2;
console.log(a,b);//[2,2,3,4]   [1,2,3,4] 
// 可以看出b数组不会收a数组影响了

(1)删除元素:array.splice(index,howmany)

var arr= ["a", "b", "c", "d"];
var newArr = arr.splice(1, 2); // splice(1,2)的意识是删除数组下标为1的两个数
console.log(arr,newArr);     // arr:a d    newArr:b c

(2)替换元素:array.splice(index,howmany,item1....itemx)

var arr = [1, 2, 3, 4, 5, 6];
var newArr = arr.splice(3, 1, "1", "2");//splice(3, 1, "1", "2")表示数组下标为3的数被1和2代替
console.log(arr,newArr);   // arr:1,2,3,1,2,5,6   newArr:4 

(3)插入元素:array.splice(index,howmany,item1,.....,itemX)。和替换很相似,只需要将howmany的数值改为0即可。

var arr = [1, 2, 3, 4, 5, 6];
var newArr = arr.splice(3, 0, "1", "2"); 
//splice(3, 0, "1", "2")表示在数组下标为3的数之前添加数1、2
console.log(arr);   // arr:1,2,3,1,2,5,6 
console.log(newArr); 

(4)在for循环中使用。定一个数组,假设我要把中间的数字3删掉,数字3是数组下标2的元素,而且只需删掉1个数字。 

var arr = [1, 2, 3, 4, 5]; 
for(var i=0; i<arr.length; i++){
    if(arr[i] === 3){   //如果找到要被删除的数字所在的数组下标
        var num = arr.splice( i, 1 );   //从i位置开始删除1个数字
        console.log("成功删除 "+num);    //输出被删除的数字
    } else{
        console.log(arr[i]+" 未被删除"); //如果i下标的数组元素不是需要被删除的数字,就输出数字
    }
}

打印结果可以看出,数字3被删掉了。但4没了。因为splice 是直接操作并修改数组的,所以当找到数字3时在循环中的 i 下标是2,而当删除数字3后,数组下标 i 位置中保存的数字变为了数字4,然后到了下一个循环 i 下标为3时,数组下标 i 位置中保存的数字是5,所以跳过了数字4,于是调试信息中没有数字4 。如何解决呢?在使用 splice 的下一句,改一下循环变量值即可

if(arr[i] === 3){   //如果找到要被删除的数字所在的数组下标
    var num = arr.splice( i, 1 );   //从i位置开始删除1个数字
    console.log("成功删除 "+num);    //输出被删除的数字
    
    i = i-1;    //解决方案
}

更多例子:

let arr1 = [
  { label: "aaa",value: 1},
  { label: "bbb",value: 2},
  { label: "ccc",value: 3},
];
let arr2 = [
  { label: "aaa",value: 1},
  { label: "bbb",value: 2},
];
let arr3 = [
  { label: "aaa", value: 1 },
  { label: "bbb", value: 2 },
  { label: "ccc", value: 3 },
  { label: "ddd", value: 4 },
];

(1)删除arr1中比arr2中多的对象

for (let i = 0; i < arr1.length; i++) {
  let found = false;
  for (let j = 0; j < arr2.length; j++) {
    if (
      arr1[i].label === arr2[j].label &&
      arr1[i].value === arr2[j].value
    ) {
      found = true;
      break;
    }
  }
  if (!found) {
    arr1.splice(i, 1);
    i--;
  }
}
console.log(arr1); // [{label: "1", value: 15},{label: "1", value: 16}]

(2)将arr1中比arr2中多的对象,label值改为空字符串

for (let i = 0; i < arr1.length; i++) {
	let found = false;
	for (let j = 0; j < arr2.length; j++) {
		if (
			arr1[i].label === arr2[j].label &&
			arr1[i].value === arr2[j].value
		) {
			found = true;
			break;
		}
	}
	if (!found) {
		arr1[i].label = "";
	}
}
console.log(arr1); // [{label: "aaa", value: 1},{label: "bbb", value: 2},{label:"", value: 3}]

(3)若label和value相同,不往arr3中添加arr1中的对象;若value相同而label不同,arr3中的label值改为'eee';若arr1对中对象的value,arr3中没有,这个对象直接添加到arr3中

for (let i = 0; i < arr1.length; i++) {
  let found = false;
  for (let j = 0; j < arr3.length; j++) {
    if (
      arr1[i].label === arr3[j].label &&
      arr1[i].value === arr3[j].value
    ) {
      found = true;
      break;
    } else if (
      arr1[i].value === arr3[j].value &&
      arr1[i].label !== arr3[j].label
    ) {
      arr3[j].label = "eee";
      found = true;
      break;
    }
  }
  if (!found) {
    arr3.push(arr1[i]);
  }
}
console.log(arr3);// [{ label: "aaa", value: 1 },{ label: "bbb", value: 2 },{ label: "eee", value: 3 },{ label: "ddd", value: 4 }]; 

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值