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 ] ]