使用map循环时删除关联对象

时间:2017-05-08 18:44:33

标签: javascript arrays

我有一个json数组,我需要删除id值为 5 的子数组,该子数组属于serialNo 1 。我尝试了以下方法,但它没有删除子数组中的任何条目。

let Details = [
    { "serialNo": "1", "text": "AAA", "subArray": [{ "id": "1", "name": "geo" }, { "id": "5", "name": "gau" }, { "id": "4", "name": "joi" }] },
    { "serialNo": "2", "text": "BBB", "subArray": [{ "id": "7", "name": "rom" }, { "id": "5", "name": "dom" }, { "id": "4", "name": "noi" }] },
    { "serialNo": "3", "text": "CCC", "subArray": [{ "id": "1", "name": "glo" }, { "id": "5", "name": "gum" }, { "id": "4", "name": "lom" }] }
];

Details.map((data) => {
    if (data.serialNo === "1") {
        data.subArray.map((subDetails) => {
            if (subDetails.id === "5") {
                delete data.subArray[subDetails];
            }
        })
    }
})

3 个答案:

答案 0 :(得分:1)

第一个问题是你没有从map函数中返回任何内容。第二个问题是data.subArray[subDetails]未定义,subDetails是一个对象,而不是data.subArray数组中的索引。您可以使用mapfilter的组合来完成此操作,而不是使用delete

let Details = [
        { "serialNo": "1", "text": "AAA", "subArray": [{ "id": "1", "name": "geo" }, { "id": "5", "name": "gau" }, { "id": "4", "name": "joi" }] },
        { "serialNo": "2", "text": "BBB", "subArray": [{ "id": "7", "name": "rom" }, { "id": "5", "name": "dom" }, { "id": "4", "name": "noi" }] },
        { "serialNo": "3", "text": "CCC", "subArray": [{ "id": "1", "name": "glo" }, { "id": "5", "name": "gum" }, { "id": "4", "name": "lom" }] }
    ];

    Details.map((data) => {
        if (data.serialNo === "1") {
            data.subArray = data.subArray.filter((subDetails) => {
                return subDetails.id !== "5";
            })
        }
        return data;
    });

console.log(Details);

如果您想坚持map,您需要做的是在undefinedsubDetails.id时返回5

let Details = [
            { "serialNo": "1", "text": "AAA", "subArray": [{ "id": "1", "name": "geo" }, { "id": "5", "name": "gau" }, { "id": "4", "name": "joi" }] },
            { "serialNo": "2", "text": "BBB", "subArray": [{ "id": "7", "name": "rom" }, { "id": "5", "name": "dom" }, { "id": "4", "name": "noi" }] },
            { "serialNo": "3", "text": "CCC", "subArray": [{ "id": "1", "name": "glo" }, { "id": "5", "name": "gum" }, { "id": "4", "name": "lom" }] }
        ];

Details.map((data) => {
    if (data.serialNo === "1") {
        data.subArray = data.subArray.filter((subDetails) => {
            return subDetails.id === "5" ? undefined : subDetails;
        })
    }
    return data;
});

console.log(Details);

答案 1 :(得分:1)

我不知道为什么你明确想要使用map函数。但是以下工作:

let Details = [
        { "serialNo": "1", "text": "AAA", "subArray": [{ "id": "1", "name": "geo" }, { "id": "5", "name": "gau" }, { "id": "4", "name": "joi" }] },
        { "serialNo": "2", "text": "BBB", "subArray": [{ "id": "7", "name": "rom" }, { "id": "5", "name": "dom" }, { "id": "4", "name": "noi" }] },
        { "serialNo": "3", "text": "CCC", "subArray": [{ "id": "1", "name": "glo" }, { "id": "5", "name": "gum" }, { "id": "4", "name": "lom" }] }
    ];

Details = Details.map(function (data) {
    if (data.serialNo === "1") {
        data.subArray = data.subArray.filter(function (sa) {
            return (sa.id !== "5");
        });
    }
    return data;
});

console.log(Details);

答案 2 :(得分:1)

一个map加上对象构造函数:

const arr = [
        { "serialNo": "1", "text": "AAA", "subArray": [{ "id": "1", "name": "geo" }, { "id": "5", "name": "gau" }, { "id": "4", "name": "joi" }] },
        { "serialNo": "2", "text": "BBB", "subArray": [{ "id": "7", "name": "rom" }, { "id": "5", "name": "dom" }, { "id": "4", "name": "noi" }] },
        { "serialNo": "3", "text": "CCC", "subArray": [{ "id": "1", "name": "glo" }, { "id": "5", "name": "gum" }, { "id": "4", "name": "lom" }] }
    ];

const s = 1, id = 5; // conditions

const r = arr.map(e => (e.serialNo == s) 
  ? Object.assign(e, {'subArray': e.subArray.filter(a => a.id != id)}) 
  : e);
  
console.log(JSON.stringify(r, null, 2));

Object.assign将旧版subArray与新版本的{{1}}进行互换。