先说下,简单的需求:
前车之鉴以供参考
<script>
var arrayA = [{
name: 'a',
age: '1',
property: 'a'
},
{
name: 'b',
age: '2',
property: 'b'
},
{
name: 'c',
age: '3',
property: 'c'
},
{
name: 'd',
age: '4',
property: 'd'
},
{
name: 'e',
age: '5',
property: 'e'
},
]; // 数组A
var arrayB = [{
property: 'b'
},
{
property: 'd'
},
{
property: 'g'
},
{
property: 'f'
},
]; // 数组B
var tempArr = []
for (var i = 0; i < arrayA.length; i++) {
var elementA = arrayA[i];
for (var j = 0; j < arrayB.length; j++) {
var elementB = arrayB[j];
if (elementA.property === elementB.property) {
arrayA.splice(i, 1);
tempArr.push(elementA)
i--; // 减少索引,以便下次循环检查当前位置的元素
}
}
}
console.log('arrayA', arrayA)
console.log('tempArr', tempArr)
</script>
<script>
var arrayA = [{
name: 'a',
age: '1',
property: 'a'
},
{
name: 'b',
age: '2',
property: 'b'
},
{
name: 'c',
age: '3',
property: 'c'
},
{
name: 'd',
age: '4',
property: 'd'
},
{
name: 'e',
age: '5',
property: 'e'
},
]; // 数组A
var arrayB = [{
property: 'a'
},
{
property: 'd'
},
{
property: 'g'
},
{
property: 'f'
},
]; // 数组B
var tempArr = []
for (var i = 0; i < arrayA.length; i++) {
var elementA = arrayA[i];
for (var j = 0; j < arrayB.length; j++) {
var elementB = arrayB[j];
if (elementA.property === elementB.property) {
arrayA.splice(i, 1);
tempArr.push(elementA)
i--; // 减少索引,以便下次循环检查当前位置的元素
break; // 跳出内部循环,继续下一个元素的判断
}
}
}
console.log('arrayA', arrayA)
console.log('tempArr', tempArr)
</script>
相较于第一版,跳出内部循环后,整体执行语句的开销会减少。
如果不使用 break 语句跳出内部循环,并且希望在找到相同属性的元素后继续比较数组的剩余元素,可以使用一个额外的布尔变量来记录是否找到相同属性的元素,并将内部循环遍历完整个数组。然后,根据布尔变量的值决定是否删除数组A中的元素。
<script>
var arrayA = [{
name: 'a',
age: '1',
property: 'a'
},
{
name: 'b',
age: '2',
property: 'b'
},
{
name: 'c',
age: '3',
property: 'c'
},
{
name: 'd',
age: '4',
property: 'd'
},
{
name: 'e',
age: '5',
property: 'e'
},
]; // 数组A
var arrayB = [{
property: 'a'
},
{
property: 'd'
},
{
property: 'g'
},
{
property: 'f'
},
]; // 数组B
var tempArr = []
for (var i = 0; i < arrayA.length; i++) {
var elementA = arrayA[i];
var foundMatch = false;
for (var j = 0; j < arrayB.length; j++) {
var elementB = arrayB[j];
if (elementA.property === elementB.property) {
tempArr.push(elementA)
foundMatch = true;
}
}
if (foundMatch) {
arrayA.splice(i, 1);
i--; // 减少索引,以便下次循环检查当前位置的元素
}
}
console.log('arrayA', arrayA)
console.log('tempArr', tempArr)
</script>
<script>
var arrayA = [{
name: 'a',
age: '1',
property: 'a'
},
{
name: 'b',
age: '2',
property: 'b'
},
{
name: 'c',
age: '3',
property: 'c'
},
{
name: 'd',
age: '4',
property: 'd'
},
{
name: 'e',
age: '5',
property: 'e'
},
]; // 数组A
var arrayB = [{
property: 'a'
},
{
property: 'd'
},
{
property: 'g'
},
{
property: 'f'
},
]; // 数组B
var tempArr = []
arrayA.forEach(function (elementA,index ) {
arrayB.forEach(function (elementB) {
if (elementA.property === elementB.property) {
tempArr.push(elementA)
arrayA.splice(index, 1);
}
});
});
console.log('arrayA', arrayA)
console.log('tempArr', tempArr)
</script>
这里则需要简单说明下,for循环和forEach遍历数组的优劣:
for
循环:
使用最广泛的方法,提供了完全的灵活性和控制。
需要手动管理索引和循环条件。
forEach
方法:
提供了一种简单且易于使用的遍历数组的方法。
无需手动管理索引和循环条件。
无法中断或跳出循环。
修改为forEach后,无需手动改变循环下标,代码也更加的简洁
有时候疲于项目进度,代码质量方面就容易出现一些问题。机械化的工作,会减少人尝试新事物的激情。