数组拼接 - Javascript
Array Splice - Javascript
这是一个非常小的问题,对于我来说,我无法弄清楚它是什么。我的大脑已经锁定了自己,无法思考。我需要其他人看看这段代码。
代码的输出应该是:[1,0,0,0]
更新:
该函数应该能够读取一个数字数组,如果它在数组中找到任何零,它应该将它们移动到数组的末尾。
代码的输出不断出现:[0,1,0,0]
var arrNum = [0,0,0,1];
function test() {
for(var i=0; i<arrNum.length; i++){
if(arrNum[i] == 0){
arrNum.splice(i,1)
arrNum.splice(arrNum.length, 1, 0)
}
}
return alert(arrNum)
}
Here 是一个正在工作的 plunker。
对此表示歉意,我知道问题很小,但我的大脑现在已经停止工作,我需要一双新的眼睛。
您可以使用 unshift() 在数组的开头插入并使用 push() 到结尾...
var arrNum = [0,0,0,1];
var output = [];
function test()
{
for(var i=0; i<arrNum.length; i++)
{
if(arrNum[i] == 0)
output.push(0);
else
output.unshift(arrNum[i]);
}
return alert(output)
}
var arrNum = [0,0,0,1];
var result = [];
arrNum.forEach(function(v) {
!!v ? result.unshift(v) : result.push(v);
});
console.log(result);
按照你写的方式,你需要按相反的顺序循环。当您删除索引时,您最终会跳过索引。反向循环可防止您跳过它们。
for(var i=arrNum.length-1; i>=0; i--){
您正在使用索引 i = 0,1,2,3 进行迭代,同时删除数组的第一个元素。所以你的迭代看不到 1,它在移动到已经迭代的索引时跳过。最简单的方法就是反转循环来绕过这个问题。
var arrNum = [0,0,0,1];
function test() {
for(var i= arrNum.length; i >= 0; i--){
if(arrNum[i] == 0){
arrNum.splice(i,1)
arrNum.splice(arrNum.length, 1, 0)
}
}
return alert(arrNum)
}
尽可能使用内置函数。
var output = [];
[0,0,0,1].forEach(function(num) {
if(num == 0) output.push(0);
else output.unshift(num)
})
为什么不用临时数组来帮忙呢?您的代码的问题是 splice() 函数修改了原始数组,而您是在循环内进行的。
下面的代码可以生成您需要的内容:
var arrNum = [0,0,0,1];
var arrResult = new Array();
function test() {
for(var i=arrNum.length-1; i>=0; i--)
{
arrResult.push(arrNum[i]);
}
arrNum = arrResult;
return alert(arrNum);
}
使用另一个数组来存储新值,您可以灵活地对第一个数组的数据执行任何需要的操作。
一个很好的使用对象的小方法 - 忙着学习它们所以只是发布了一个变化的deligation
var methods = {
moveZero: function(arr){
//console.log(arr);
var newArr = [];
for(var i = 0; i < arr.length; i++){
if(arr[i] === 0){
newArr.push(arr[i]);
}else{
newArr.unshift(arr[i]);
}
}
console.log(newArr);
}
}
var arrNum = Object.create(methods);
arrNum.moveZero([0,0,50,56,85,0,0,43,10,0,1]);
JSFiddle - https://jsfiddle.net/ToreanJoel/qh0xztgc/1/
问题是您在 if 语句中循环遍历数组时修改数组。
Here 是你的例子的一个工作 plunker。
var len = arrNum.length;
var index = 0;
while(len) {
if(arrNum[index] == 0) {
arrNum.splice(index,1);
arrNum.push(0);
} else {
++index;
}
--len;
}
由于您要执行的操作实际上是排序,为了代码的可读性和紧凑性,您可能应该改为这样做:
var arrNum = [0,1,0,0];
arrNum.sort(function(a, b) {
return a == 0 ? 1 : 0;
});
它可以包含任何数字,并且将保持除 0 以外的顺序
这是一个非常小的问题,对于我来说,我无法弄清楚它是什么。我的大脑已经锁定了自己,无法思考。我需要其他人看看这段代码。
代码的输出应该是:[1,0,0,0]
更新:
该函数应该能够读取一个数字数组,如果它在数组中找到任何零,它应该将它们移动到数组的末尾。
代码的输出不断出现:[0,1,0,0]
var arrNum = [0,0,0,1];
function test() {
for(var i=0; i<arrNum.length; i++){
if(arrNum[i] == 0){
arrNum.splice(i,1)
arrNum.splice(arrNum.length, 1, 0)
}
}
return alert(arrNum)
}
Here 是一个正在工作的 plunker。
对此表示歉意,我知道问题很小,但我的大脑现在已经停止工作,我需要一双新的眼睛。
您可以使用 unshift() 在数组的开头插入并使用 push() 到结尾...
var arrNum = [0,0,0,1];
var output = [];
function test()
{
for(var i=0; i<arrNum.length; i++)
{
if(arrNum[i] == 0)
output.push(0);
else
output.unshift(arrNum[i]);
}
return alert(output)
}
var arrNum = [0,0,0,1];
var result = [];
arrNum.forEach(function(v) {
!!v ? result.unshift(v) : result.push(v);
});
console.log(result);
按照你写的方式,你需要按相反的顺序循环。当您删除索引时,您最终会跳过索引。反向循环可防止您跳过它们。
for(var i=arrNum.length-1; i>=0; i--){
您正在使用索引 i = 0,1,2,3 进行迭代,同时删除数组的第一个元素。所以你的迭代看不到 1,它在移动到已经迭代的索引时跳过。最简单的方法就是反转循环来绕过这个问题。
var arrNum = [0,0,0,1];
function test() {
for(var i= arrNum.length; i >= 0; i--){
if(arrNum[i] == 0){
arrNum.splice(i,1)
arrNum.splice(arrNum.length, 1, 0)
}
}
return alert(arrNum)
}
尽可能使用内置函数。
var output = [];
[0,0,0,1].forEach(function(num) {
if(num == 0) output.push(0);
else output.unshift(num)
})
为什么不用临时数组来帮忙呢?您的代码的问题是 splice() 函数修改了原始数组,而您是在循环内进行的。
下面的代码可以生成您需要的内容:
var arrNum = [0,0,0,1];
var arrResult = new Array();
function test() {
for(var i=arrNum.length-1; i>=0; i--)
{
arrResult.push(arrNum[i]);
}
arrNum = arrResult;
return alert(arrNum);
}
使用另一个数组来存储新值,您可以灵活地对第一个数组的数据执行任何需要的操作。
一个很好的使用对象的小方法 - 忙着学习它们所以只是发布了一个变化的deligation
var methods = {
moveZero: function(arr){
//console.log(arr);
var newArr = [];
for(var i = 0; i < arr.length; i++){
if(arr[i] === 0){
newArr.push(arr[i]);
}else{
newArr.unshift(arr[i]);
}
}
console.log(newArr);
}
}
var arrNum = Object.create(methods);
arrNum.moveZero([0,0,50,56,85,0,0,43,10,0,1]);
JSFiddle - https://jsfiddle.net/ToreanJoel/qh0xztgc/1/
问题是您在 if 语句中循环遍历数组时修改数组。
Here 是你的例子的一个工作 plunker。
var len = arrNum.length;
var index = 0;
while(len) {
if(arrNum[index] == 0) {
arrNum.splice(index,1);
arrNum.push(0);
} else {
++index;
}
--len;
}
由于您要执行的操作实际上是排序,为了代码的可读性和紧凑性,您可能应该改为这样做:
var arrNum = [0,1,0,0];
arrNum.sort(function(a, b) {
return a == 0 ? 1 : 0;
});
它可以包含任何数字,并且将保持除 0 以外的顺序