Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 修改仅知道要访问的索引的动态嵌套数组_Javascript_Arrays_Json_Recursion_Ecmascript 6 - Fatal编程技术网

Javascript 修改仅知道要访问的索引的动态嵌套数组

Javascript 修改仅知道要访问的索引的动态嵌套数组,javascript,arrays,json,recursion,ecmascript-6,Javascript,Arrays,Json,Recursion,Ecmascript 6,我有必要修改嵌套对象数组结构,该结构始终具有相同的模式,只知道访问我要更改的特定对象的索引 JSON数组示例: [ { "name":"bob", "age":5, "subRows":[ { "name":"paul", "age":10,

我有必要修改嵌套对象数组结构,该结构始终具有相同的模式,只知道访问我要更改的特定对象的索引

JSON数组示例:

[
    {
    "name":"bob",
    "age":5,
    "subRows":[
        {   
            "name":"paul",
            "age":10,
            "subRows":[]
        },
        {   
            "name":"claire",
            "age":20,
            "subRows":[
                {   
                    "name":"carl",
                    "age":40,
                    "subRows":[]
                }
            ]
        }
    }
]
我需要动态删除一个每次都可能不同的对象,比如一个名为“carl”的对象,因此要达到预期的效果:

[
    {
    "name":"bob",
    "age":5,
    "subRows":[
        {   
            "name":"paul",
            "age":10,
            "subRows":[]
        },
        {   
            "name":"claire",
            "age":20,
            "subRows":[]
        }
    }
]
了解Json结构的所有索引以访问它:

let indexesArray = [0, 1, 0];
我试过这个:

const deleteObject = (jsonData, indexesArray) =>{
    let pathToDelete =  "jsonData[indexesArray[0]]";
    for(let i=1; i<indexesArray.length(); i++){
        pathToDelete += ".subRows["i"]";
    ]
    pathToDelete = []; //empty the array removing "carl" object
    return jsonData;
}
constdeleteObject=(jsonData,indexesArray)=>{
让pathToDelete=“jsonData[indexesArray[0]]”;

对于(设i=1;i这里有一个版本,稍微通用一些,允许我们动态地提供名称
subRow
,以生成执行此操作的函数:

constremoveindexpath=(子名称)=>(xs[i,…is])=>
i==未定义
?xs
:is.length==0
?[…xs.slice(0,i),…xs.slice(i+1)]//跳过xs[i]
: [
…x.切片(0,i),
…(xs中的i//replace xs[i]方法是重复使用子名称上的剩余路径
?[{…xs[i],[subName]:removeIndexPath(subName)(xs[i][subName]| |[],is)]]
:[]//处理缺少的节点
), 
…x.slice(i+1)
]
const removeSubRowPath=removeIndexPath('subwrws'))
const input=[{name:“bob”,年龄:5岁,subRows:[{name:“paul”,年龄:10岁,subRows:[]},{name:“claire”,年龄:20岁,subRows:[{name:“carl”,年龄:40岁,subRows:[]}]
log('without carl:',removeSubRowPath(输入,[0,1,0]))
log('without clair:',removeSubRowPath(输入,[0,1]))
log('without paul:',removeSubRowPath(输入,[0,0]))
log('不带bob:',removeSubRowPath(输入,[0]))
log('没有不存在的节点:',removeSubRowPath(输入[0,3,5]))

.as console wrapper{max height:100%!important;top:0}
您可以对索引数组使用
reduce
方法,当它是最后一个索引并且找到匹配项时,您可以使用
splice
方法从数组中逐个索引删除该元素

const data=[{“name”:“bob”,“age”:5,“subRows”:[{“name”:“paul”,“age”:10,“subRows”:[]},{“name”:“claire”,“age”:20,“subRows”:[{“name”:“carl”,“age”:40,“subRows”:[]}]
设indexesArray=[0,1,0];
indexesArray.reduce((r,e,i,a)=>{
常数匹配=r[e];
如果(a.length==i+1&&match)r.拼接(e,1)
else if(match)返回match.subRows;
返回{}
},数据)

console.log(data)
既然您已经将问题标记为“递归”,下面是一个简单的递归:

功能f(arr,路径){
功能g(i,当前){
if(i==path.length-1){
当前副线束拼接(路径[i],1);
返回arr;
}否则{
返回g(i+1,curr.subRows[path[i]]);
}
}
返回g(1,arr[path[0]]);
}
var数据=[{“姓名”:“鲍勃”,“年龄”:5,“代词”:[{“姓名”:“保罗”,“年龄”:10,“代词”:[]},{“姓名”:“克莱尔”,“年龄”:20,“代词”:[{“姓名”:“卡尔”,“年龄”:40,“代词”:[]}]}];
变量路径=[0,1,0];

log(f(数据,路径));
这里是一个使用

首先我们创建路径,然后拼接找到的实体

//const objectScan=require('object-scan');
const myData=[{name:'bob',age:5,subRows:[{name:'paul',age:10,subRows:[]},{name:'claire',age:20,subRows:[{name:'carl',age:40,subRows:[]}];
常量修剪=(数据、索引)=>objectScan(
[index.map((e)=>`[${e}]`.join('.subRows'),
{
rtn:‘bool’,
中止:对,
filterFn:({property,parent})=>parent.splice(property,1)
}
)(数据);
log(prune(myData[0,1,0]);//返回true
//=>正确
console.log(myData);
//=>[{name:'bob',年龄:5岁,subRows:[{name:'paul',年龄:10岁,subRows:[]},{name:'claire',年龄:20岁,subRows:[]}]
。作为控制台包装{最大高度:100%!重要;顶部:0}