Javascript 的 "splice" 方法异常行为
Javascript's "splice" method strange behavior
我试图解决 "free code camp" 网站上的一些编程挑战,问题是找到多个数组之间的对称差异和 returning 提供的对称差异的数组数组。
例如以下数组:
[1, 2, 5], [2, 3, 5], [3, 4, 5]
应该return[1,4,5]
这就是我想出的:
function sym() {
var final = [];
var current_array = [];
for (var i = 0; i < arguments.length; i++) {
current_array = arguments[i];
//ensures duplicates inside each array are removed first
current_array = current_array.filter(function (element, index) {
return current_array.indexOf(element) == index;
});
for (var j = 0, end = current_array.length; j < end; j++) {
if(final.indexOf(current_array[j]) < 0)
final.push(current_array[j]);
else
// for some reason "splice" isn't working properly..
// final.splice(final.indexOf(current_array[j], 1));
delete final[final.indexOf(current_array[j])];
}
}
var final_2 = [];
// Removing the empty slots caused by the "delete" keyword usage
for (var m = 0; m < final.length; m++) {
if(typeof final[m] !== 'undefined')
final_2.push(final[m]);
}
return final_2;
}
在前面的逻辑中,我创建了一个名为 final 的数组,它应该包含在所有传递的数组中只存在一次的所有元素,首先我遍历arguments 参数在这里表示数组,对于每个数组,我循环遍历其元素并检查该元素是否存在于 final 数组中。如果它存在,我将它从 final 数组中删除,否则我将它推入数组。
这里的问题是,如果我使用上面代码中给出的拼接方法,它的行为会非常奇怪,例如对于以下数组
[1, 2, 3], [5, 2, 1, 4],结果应该是:[3, 5, 4]
当我使用这条线时
final.splice(final.indexOf(current_array[j], 1));
而不是
delete final[final.indexOf(current_array[j])];
和return最终数组它return这个[4]
这是每次迭代的数组值
轮 (0, 0): 1
轮 (0, 1): 1,2
轮 (0, 2): 1,2,3
轮 (1, 0): 1,2,3,5
轮 (1, 1): 1
轮(1, 2):
轮 (1, 3): 4
一旦到达数组中存在的元素,它就会删除从该元素开始直到数组末尾的所有元素。
我不确切地知道我是否遗漏了什么,我试图搜索任何类似的问题,但我想到的大部分是从该人正在循环的数组中删除元素的问题,并且因此缺少它的索引.. 在我的例子中,我试图修改的数组与我正在迭代的数组无关。
我也相信 splice 修改数组并 returns 删除的元素.. 如果我没有得到它请纠正我。
您错放了 )
,更正如下:
final.splice( final.indexOf(current_array[j]), 1 );
附加说明:算法为第一个数组添加 5
,为第二个数组删除它,并为第三个数组再次添加它(因为它不再存在于 final
中) ,导致 [1,4,5]
。
对于奇数个参数,值被保留,对于偶数个,它被删除。
从所有数组中获取所有唯一值的更简单方法(如果这是意图),是计算出现次数并过滤单个出现次数:
function sym2() {
var count = {};
for ( var i in arguments ) {
console.log("Processing ", i );
for ( var k = 0; k < arguments[i].length; k ++)
count[ arguments[i][k] ] = (count[ arguments[i][k] ]||0) + 1;
}
var final = [];
for ( var i in count )
if ( count[i] == 1 )
final.push( i );
return final;
}
sym2([1, 2, 5], [2, 3, 5], [3, 4, 5]);
请注意,这将 return [1,4]
而不是 [1,4,5]
。
我试图解决 "free code camp" 网站上的一些编程挑战,问题是找到多个数组之间的对称差异和 returning 提供的对称差异的数组数组。
例如以下数组:
[1, 2, 5], [2, 3, 5], [3, 4, 5]
应该return[1,4,5]
这就是我想出的:
function sym() {
var final = [];
var current_array = [];
for (var i = 0; i < arguments.length; i++) {
current_array = arguments[i];
//ensures duplicates inside each array are removed first
current_array = current_array.filter(function (element, index) {
return current_array.indexOf(element) == index;
});
for (var j = 0, end = current_array.length; j < end; j++) {
if(final.indexOf(current_array[j]) < 0)
final.push(current_array[j]);
else
// for some reason "splice" isn't working properly..
// final.splice(final.indexOf(current_array[j], 1));
delete final[final.indexOf(current_array[j])];
}
}
var final_2 = [];
// Removing the empty slots caused by the "delete" keyword usage
for (var m = 0; m < final.length; m++) {
if(typeof final[m] !== 'undefined')
final_2.push(final[m]);
}
return final_2;
}
在前面的逻辑中,我创建了一个名为 final 的数组,它应该包含在所有传递的数组中只存在一次的所有元素,首先我遍历arguments 参数在这里表示数组,对于每个数组,我循环遍历其元素并检查该元素是否存在于 final 数组中。如果它存在,我将它从 final 数组中删除,否则我将它推入数组。
这里的问题是,如果我使用上面代码中给出的拼接方法,它的行为会非常奇怪,例如对于以下数组
[1, 2, 3], [5, 2, 1, 4],结果应该是:[3, 5, 4]
当我使用这条线时
final.splice(final.indexOf(current_array[j], 1));
而不是
delete final[final.indexOf(current_array[j])];
和return最终数组它return这个[4]
这是每次迭代的数组值
轮 (0, 0): 1
轮 (0, 1): 1,2
轮 (0, 2): 1,2,3
轮 (1, 0): 1,2,3,5
轮 (1, 1): 1
轮(1, 2):
轮 (1, 3): 4
一旦到达数组中存在的元素,它就会删除从该元素开始直到数组末尾的所有元素。
我不确切地知道我是否遗漏了什么,我试图搜索任何类似的问题,但我想到的大部分是从该人正在循环的数组中删除元素的问题,并且因此缺少它的索引.. 在我的例子中,我试图修改的数组与我正在迭代的数组无关。 我也相信 splice 修改数组并 returns 删除的元素.. 如果我没有得到它请纠正我。
您错放了 )
,更正如下:
final.splice( final.indexOf(current_array[j]), 1 );
附加说明:算法为第一个数组添加 5
,为第二个数组删除它,并为第三个数组再次添加它(因为它不再存在于 final
中) ,导致 [1,4,5]
。
对于奇数个参数,值被保留,对于偶数个,它被删除。
从所有数组中获取所有唯一值的更简单方法(如果这是意图),是计算出现次数并过滤单个出现次数:
function sym2() {
var count = {};
for ( var i in arguments ) {
console.log("Processing ", i );
for ( var k = 0; k < arguments[i].length; k ++)
count[ arguments[i][k] ] = (count[ arguments[i][k] ]||0) + 1;
}
var final = [];
for ( var i in count )
if ( count[i] == 1 )
final.push( i );
return final;
}
sym2([1, 2, 5], [2, 3, 5], [3, 4, 5]);
请注意,这将 return [1,4]
而不是 [1,4,5]
。