繁体   English   中英

Lodash:如何使用 id 从数组中删除项目或嵌套项目?

[英]Lodash: How to remove item or nested item from array using an id?

我有一个如下所示的数组:

[
    {
        "id": "denuzi",
        "sub":
        [
            {"id": "s4p58o"},
            {"id": "xzbqi"},
        ],
    },
    {
        "id": "4rcodm",
        "sub": [],
    }
]

我想要做的是使用提供的 id 从数组或嵌套数组中删除一个项目。

例如,如果提供了denuzi ,则整个第一个对象将被删除; 如果提供了s4p58o则仅删除第一个对象子数组中的对象。

我知道我可以使用以下代码删除整个对象:

_.remove(this.items, function(item) {
    return item.id !== id;
});

但我不确定如何进行检查以删除子项目?

您可以通过检查id或再次调用sub来采用迭代和递归方法。 找到就退出。

 function remove(array, id) { return array.some((o, i, a) => o.id === id ? a.splice(i, 1) : remove(o.sub || [], id) ); } var array = [{ id: "denuzi", sub: [{ id: "s4p58o" }, { id: "xzbqi" }] }, { id: "4rcodm", sub: [] }]; remove(array, 's4p58o'); console.log(array); remove(array, 'denuzi'); console.log(array);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

只需使用Array.prototype.filter

 var list = [ { "id": "denuzi", "sub": [ {"id": "s4p58o"}, {"id": "xzbqi"}, ], }, { "id": "4rcodm", "sub": [], } ] const result = list.filter(a => a.id !== 'denuzi'); console.log(result);

不使用 lodash

 let data = [ { "id": "denuzi", "sub": [ {"id": "s4p58o"}, {"id": "xzbqi"}, ], }, { "id": "4rcodm", "sub": [], } ] function remove(data, removeId){ return data .filter(({id}) => id!==removeId) // removes parent object if its id matches removeId .map(({id, sub}) => ({id, sub: sub.filter(({id}) => id!==removeId)})) // replaces sub array with new sub array with subobject missing } console.log(remove(data, "s4p58o")); console.log(remove(data, "denuzi"))

用 lodash

 const data = [ { "id": "denuzi", "sub": [ {"id": "s4p58o"}, {"id": "xzbqi"}, ], }, { "id": "4rcodm", "sub": [], } ] function remove(data, removeId){ return _.remove(data, (item) => item.id !== removeId) // removes parent object if its id matches removeId .map(({id, sub}) => ({id, sub: _.remove(sub, (item) => item.id !== removeId)})) // replaces sub array with new sub array with subobject missing } // i parse data to do a deep copy for showing the property console.log(remove(JSON.parse(JSON.stringify(data)), "s4p58o")); console.log(remove(JSON.parse(JSON.stringify(data)), "denuzi"))
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM