从 ngrx 存储中递归删除
Recursive delete from ngrx store
我使用 Angular 10 和库 ngrx 存储,但我不明白如何从 ngrx 存储中递归删除。在商店中,我有一个嵌套的对象数组。如何通过 id 递归删除对象?当我尝试使用拼接和函数删除时出现错误:
Cannot assign to read only property '0' of object '[object Array]'
我做错了什么?
数据示例:
[
{
"id": 414,
"name": "mail.ru",
"is_main": true,
"subdomains": [
{
"id": 423,
"name": "en.mail.ru",
"is_main": false,
"subdomains": [
{
"id": 429,
"name": "gw.mail1.ru",
"is_main": false,
"subdomains": [
{
"id": 426,
"name": "gw.mail3.ru",
"is_main": false,
"subdomains": []
}
]
}
]
},
{
"id": 425,
"name": "gw.mail.ru",
"is_main": false,
"subdomains": []
}
]
}
]
存储减速器:
case UserInfoActionTypes.UPDATE_DOMAINS_LIST: {
return {
...state,
domainsInfo: deleteItems(state.domainsInfo, [parseInt(action.payload.id, 10)]),
errorMessage: null
};
}`
我的递归函数:
export function deleteItems(array, ids) {
let i = array.length;
while (i--) {
if (ids.indexOf(array[i].id) !== -1) {
array.splice(i, 1);
continue;
}
array[i].subdomains && deleteItems(array[i].subdomains, ids);
}
return array;
}
所以基本上您需要为状态中的所有内容创建新对象,deleteItems()
可能如下所示:
export function deleteItems(array, ids) {
let result = [];
for(item of array) {
if (!ids.includes(item.id)) {
result.push({
...item,
subdomains: deleteItems(item.subdomains, ids),
})
}
}
return result;
}
我对ngrx不是很熟悉,可能漏掉了一个细节
我使用 Angular 10 和库 ngrx 存储,但我不明白如何从 ngrx 存储中递归删除。在商店中,我有一个嵌套的对象数组。如何通过 id 递归删除对象?当我尝试使用拼接和函数删除时出现错误:
Cannot assign to read only property '0' of object '[object Array]'
我做错了什么?
数据示例:
[
{
"id": 414,
"name": "mail.ru",
"is_main": true,
"subdomains": [
{
"id": 423,
"name": "en.mail.ru",
"is_main": false,
"subdomains": [
{
"id": 429,
"name": "gw.mail1.ru",
"is_main": false,
"subdomains": [
{
"id": 426,
"name": "gw.mail3.ru",
"is_main": false,
"subdomains": []
}
]
}
]
},
{
"id": 425,
"name": "gw.mail.ru",
"is_main": false,
"subdomains": []
}
]
}
]
存储减速器:
case UserInfoActionTypes.UPDATE_DOMAINS_LIST: {
return {
...state,
domainsInfo: deleteItems(state.domainsInfo, [parseInt(action.payload.id, 10)]),
errorMessage: null
};
}`
我的递归函数:
export function deleteItems(array, ids) {
let i = array.length;
while (i--) {
if (ids.indexOf(array[i].id) !== -1) {
array.splice(i, 1);
continue;
}
array[i].subdomains && deleteItems(array[i].subdomains, ids);
}
return array;
}
所以基本上您需要为状态中的所有内容创建新对象,deleteItems()
可能如下所示:
export function deleteItems(array, ids) {
let result = [];
for(item of array) {
if (!ids.includes(item.id)) {
result.push({
...item,
subdomains: deleteItems(item.subdomains, ids),
})
}
}
return result;
}
我对ngrx不是很熟悉,可能漏掉了一个细节