Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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 下划线.js-是否从嵌套数组中删除项?_Javascript_Underscore.js - Fatal编程技术网

Javascript 下划线.js-是否从嵌套数组中删除项?

Javascript 下划线.js-是否从嵌套数组中删除项?,javascript,underscore.js,Javascript,Underscore.js,我有以下对象数组: var列表=[{ “id”:119, “文件”:[] }, { “id”:126, “文件”:[{ “id”:9, “文件名”:“test1.docx”, }, { “id”:10, “文件名”:“test2.docx”, }] }] 如何通过删除具有特定id的文件(文件id是唯一的)来更新列表,例如,我想删除id为10的文件 到目前为止,我已经尝试使用下划线,但它不起作用: _.each(list.item, function(item, idx) { if (_.f

我有以下对象数组:

var列表=[{
“id”:119,
“文件”:[]
}, {
“id”:126,
“文件”:[{
“id”:9,
“文件名”:“test1.docx”,
}, {
“id”:10,
“文件名”:“test2.docx”,
}]
}]
如何通过删除具有特定id的文件(文件id是唯一的)来更新列表,例如,我想删除id为10的文件

到目前为止,我已经尝试使用下划线,但它不起作用:

_.each(list.item, function(item, idx) {
  if (_.findWhere(item.files, { id: 10 })) {
    //remove file from files array
    files.splice(idx, 1); 
  }
});
我想通过删除具有特定id的文件对象来更新列表


到目前为止,所有解决方案都创建了原始解决方案的副本。有什么方法可以简单地将它从原始列表中拼接出来吗?

您可以通过将_而不与findWhere组合来实现。我猜您想删除该id的整个数组

var列表=[
{
“id”:119,
“文件”:[]
},
{
“id”:126,
“文件”:[
{
“id”:9,
“文件名”:“test1.docx”,
},
{
“id”:10,
“文件名”:“test2.docx”,
}
]
}
];
列表=u0.without(列表,0.findWhere(列表{
身份证号码:119
}));
控制台日志(列表)

事实上,您可以完全不使用下划线:

var list=[{“id”:119,“文件”:[]},{“id”:126,“文件”:[{“id”:9,“文件名”:“test1.docx”},{“id”:10,“文件名”:“test2.docx”,}]
var itemId=126
var fileId=10
var out=list.map(函数(项){
如果(item.id==itemId){
//复制该项以不改变原始对象
var itemCopy=Object.assign({},item)
itemCopy.files=itemCopy.files.filter(函数(文件){return file.id!==fileId})
返回项目副本
}其他退货项目
})
console.log(注销)

作为旁白:您也可以在ES6中使用new object spread操作符执行此操作,并过滤掉与id不匹配的对象。当然,这会返回一个新对象,而不是从现有对象中删除对象,但这可能是您的一个选项

const out = list.map(el => {
  return {
    ...el,
    files: el.files.filter(f => f.id !== 9)
  }
});


如果没有Babel插件,这在以前是不可能实现的,但现在它似乎已经在现代浏览器中实现了。

您可以通过以下方式使用本机javascript实现:

1) 如果我只有文件id,如何删除文件对象?(文件ID是唯一的)

您可以使用
array#forEach
列表
数组中迭代,然后使用
array#filter
获取所有没有文件id的文件,并为每个作业重新分配到文件数组

var list=[{“id”:119,“文件”:[]},{“id”:126,“文件”:[{“id”:9,“文件名”:“test1.docx”,},{“id”:10,“文件名”:“test2.docx”,}]};
var deleteWithFileId=(fileId)=>list.forEach((o)=>{
o、 files=o.files.filter(({id})=>fileId!==id);
});
deleteWithFileId(10)

控制台日志(列表)
@RoryMcCrossan typo sorry请解释
如果我同时拥有项目id和文件id,那么如何删除文件对象?
,您的意思是要独立删除具有提供的id和文件id的文件,还是删除具有给定项id的文件?创建repl.it比使用代码段更好,因为后者由于未定义而无法运行添加的
\uu
并使代码运行,但它似乎无法更改嵌套数组。如果我将
id:3
更改为
id:119
,它将从该层中删除,但当从第二层(例如
id:10
)中删除时,它将不起作用。@samnu不,只有具有该id的文件对象才应该删除我希望更新原始列表。另外,如果我只有文件id,我如何实现?如果我同时拥有项目id和文件id,我如何实现相同的目标。因此,如果我有一个巨大的列表,它只需要检查一个项目是否包含匹配的文件id,如果它包含匹配的文件id,然后删除该文件。在ES5中,您可以先根据项目id进行筛选,然后根据文件id进行筛选。这将为您提供帮助。是否要从匹配的项目中删除文件id?是,我需要删除匹配的文件。文件ID在整个对象数组中是唯一的。但是,如果我知道项目id,那么就不需要检查整个项目列表,然后检查每个项目文件数组来删除一个文件。我需要更新的对象数组,而不是副本。您的foreach将不必要地在整个列表中循环。我添加了另一个解决方案,首先删除项目,然后根据您提供的id删除文件。该解决方案也会删除项目。我们不想只删除文件中的项目。与ES5中的第一个示例等效的是什么?
// ES6 version
const deleteFile1Es6 = (fileId) => {
    for(item of list){
        const file = item.files.filter(file => file.id === fileId)[0];
        if(file != null){
            item.files.splice(item.files.indexOf(file), 1);
            break;
        }
    }
};

// ES5 version
function deleteFile1Es5(fileId) {
    for(var i = 0; i < list.length; i++){
        var item = list[i];
        var fileFoundIndex = -1;
        for(var j = 0; j < item.files.length; j++){
            var file = item.files[j];
            if(file.id === fileId){
                fileFoundIndex = j;
                break;
            }
        }
        if(fileFoundIndex !== -1){
            item.files.splice(fileFoundIndex, 1);
            break;
        }
    }
}
const deleteFile2Es6 = (itemId, fileId) => {
    const item = list.filter(item => item.id === itemId)[0];
    if(item != null){
        const file = item.files.filter(file => file.id === fileId)[0];
        if(file != null){
            item.files.splice(item.files.indexOf(file), 1);
        }
    }
};