Javascript 如何用非递归实现n维到removeOne
Javascript how to implement n-dimensions to removeOne with non-recursive
输入
console.log(removeOne([]));
console.log(removeOne([1, 3, 1, 2, 1]));
console.log(removeOne([1, 4, [1, 5, 1, 2]]));
console.log(removeOne([1, 1, [1, 3, [1, 1, 4, 1], 2]]));
输出
[]
[ 3, 2 ]
[ 4, [ 5, 2 ] ]
[ [ 3, [ 4 ], 2 ] ]
function removeOne(ary) {
let result=[];
let stateu=[];
let statej=[];
for(let i=0;i<ary.length;i++){
if(ary[i] instanceof Array){
let tmp=[]
let tmp1=[]
let j=ary[i].slice();
for(let u=0;u<j.length;u++){
console.log("u "+u);
if(j[u] instanceof Array){
stateu.push(u);
statej.push(j);
j=j[u];
u=-1;
result.push(tmp);
tmp=[];
}
else if(j[u]!=1){
tmp.push(j[u]);
console.log("j "+j);
if((u+1)==j.length){
result.push(tmp);
}
}
else if((u+1)==j.length){
j=statej.pop();
u=stateu.pop();
console.log("j[u] "+j);
}
}
}
else if(ary[i]!=1)
result.push(ary[i]);
}
return result;
}
1.It 想了很多天,我是用递归实现的。但是如何仅使用循环来填充它呢?
2.It 必须由 JavaScript 执行。
//这里更新。
3.I已经实现了非递归结果的基本原型。
4.stateu 和statej 是两个liked-stack 只是用push 和pop 把前面的u 和j 存起来因为ary[0,1,.....n] 属于Array.
5.I 设置 u=-1 因为下一轮 u 将加 1。然后进入新的嵌套数组。
6.j=ary[i] 可以处理特定的数组并进行for循环。
7.Can 有人调整我的代码以获得正确的答案吗?
一种“黑客”方式。
在 stringify 和 parse 的背后当然有递归。
const removeOne = (coll) => JSON.parse(
JSON.stringify(coll)
.replaceAll('1,', '')
.replaceAll(',1', '')
);
console.dir(removeOne([1, 1, [1, 3, [1, 1, 4, 1], 2]]), {depth: null});
//[ [ 3, [ 4 ], 2 ] ]
输入
console.log(removeOne([]));
console.log(removeOne([1, 3, 1, 2, 1]));
console.log(removeOne([1, 4, [1, 5, 1, 2]]));
console.log(removeOne([1, 1, [1, 3, [1, 1, 4, 1], 2]]));
输出
[]
[ 3, 2 ]
[ 4, [ 5, 2 ] ]
[ [ 3, [ 4 ], 2 ] ]
function removeOne(ary) {
let result=[];
let stateu=[];
let statej=[];
for(let i=0;i<ary.length;i++){
if(ary[i] instanceof Array){
let tmp=[]
let tmp1=[]
let j=ary[i].slice();
for(let u=0;u<j.length;u++){
console.log("u "+u);
if(j[u] instanceof Array){
stateu.push(u);
statej.push(j);
j=j[u];
u=-1;
result.push(tmp);
tmp=[];
}
else if(j[u]!=1){
tmp.push(j[u]);
console.log("j "+j);
if((u+1)==j.length){
result.push(tmp);
}
}
else if((u+1)==j.length){
j=statej.pop();
u=stateu.pop();
console.log("j[u] "+j);
}
}
}
else if(ary[i]!=1)
result.push(ary[i]);
}
return result;
}
1.It 想了很多天,我是用递归实现的。但是如何仅使用循环来填充它呢?
2.It 必须由 JavaScript 执行。
//这里更新。
3.I已经实现了非递归结果的基本原型。
4.stateu 和statej 是两个liked-stack 只是用push 和pop 把前面的u 和j 存起来因为ary[0,1,.....n] 属于Array.
5.I 设置 u=-1 因为下一轮 u 将加 1。然后进入新的嵌套数组。
6.j=ary[i] 可以处理特定的数组并进行for循环。
7.Can 有人调整我的代码以获得正确的答案吗?
一种“黑客”方式。
在 stringify 和 parse 的背后当然有递归。
const removeOne = (coll) => JSON.parse(
JSON.stringify(coll)
.replaceAll('1,', '')
.replaceAll(',1', '')
);
console.dir(removeOne([1, 1, [1, 3, [1, 1, 4, 1], 2]]), {depth: null});
//[ [ 3, [ 4 ], 2 ] ]