【问题标题】:check array inside an array length is empty then remove the parent array from the main array检查数组长度内的数组为空然后从主数组中删除父数组
【发布时间】:2016-06-28 09:58:27
【问题描述】:

您好如何检查数组长度内的数组是否为空然后从主数组中删除父数组,

想想我有一个数组

[
    {
        "id": 71,
        "campaignAssets": [
            {
                "id": 128
            }
        ]
    },
    {
        "id": 99,
        "campaignAssets": []
    }
]

从上面的数组 id:71 有一个长度为 1 的campaignAssets 数组,但在另一个“id”:99 没有campaignAssets 所以我必须删除父数组,这意味着

    {
        "id": 99,
        "campaignAssets": []
    }

所以最终数组应该是

[
    {
        "id": 71,
        "campaignAssets": [
            {
                "id": 128
            }
        ]
    }
]

【问题讨论】:

    标签: javascript underscore.js


    【解决方案1】:

    本提案有两种解决方案,

    1. 生成一个新数组并将其分配给原始数组
    2. 删除不需要的项目而不生成临时项目。

    1.使用新数组

    你可以用Array#filter过滤它

    var data = [{ "id": 71, "campaignAssets": [{ "id": 128 }] }, { "id": 99, "campaignAssets": [] }];
    
    data = data.filter(function (a) { return a.campaignAssets.length; });
    
    console.log(data);

    在 ES6 中它甚至更短

    var data = [{ "id": 71, "campaignAssets": [{ "id": 128 }] }, { "id": 99, "campaignAssets": [] }];
    
    data = data.filter(a => a.campaignAssets.length);
    
    console.log(data);

    2。没有新数组

    对于原位解决方案,保留数组并仅删除长度为零的元素,我建议使用反向迭代并检查长度并相应地使用Array#splice

    var data = [{ "id": 71, "campaignAssets": [{ "id": 128 }] }, { "id": 99, "campaignAssets": [] }],
        i = data.length;
    
    while (i--) {
        if (!data[i].campaignAssets.length) {
            data.splice(i, 1);
        }
    }
    
    console.log(data);

    【讨论】:

    • 我建议继续在.filter 上执行回调,以通过return (a.campaignAssets.length > 0) 返回布尔值
    • 回调本身使用真/假值。 并构造一个包含所有值的新数组,回调为其返回一个强制为 true 的值。 source
    【解决方案2】:

    var data =[
        {
            "id": 71,
            "campaignAssets": [
                {
                    "id": 128
                }
            ]
        },
        {
            "id": 99,
            "campaignAssets": []
        }
    ]
    var i = data.length;
    while (i--) {
        if(data[i].hasOwnProperty('campaignAssets') && data[i]['campaignAssets'].length==0)
           data.splice(i, 1)
    }
    
    // This one is wrong implementation as pointed out, it will not delete element from reducing array..
    // data.forEach(function(parent,index){
    //  if(parent.hasOwnProperty('campaignAssets') && parent['campaignAssets'].length==0)
    //       data.splice(index, 1)
    // });
    
    console.log(data);

    【讨论】:

    • 您的解决方案将跳过一些元素,因为拼接后没有减少循环索引,参考:stackoverflow.com/q/24202962/5039495
    • 感谢@Icycool,很好。我更新了我的答案,请检查
    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多