【问题标题】:How to check if a value exist in array and count of value is greater than one?如何检查数组中是否存在值并且值的计数大于一?
【发布时间】:2018-01-03 20:45:34
【问题描述】:

我有一个数组

[
    {"name":"Ticket1","releases":[{"needToBeDeliver":true,"name":"release1","delivered":false},{"needToBeDeliver":true,"name":"release2","delivered":false}]},
    {"name":"Ticket2","releases":[{"needToBeDeliver":true,"name":"release1","delivered":false},{"needToBeDeliver":true,"name":"release2","delivered":false},{"needToBeDeliver":false,"name":"unplanned","delivered":false}]},
    {"name":"Ticket3","releases":[{"needToBeDeliver":false,"name":"release1","delivered":false},{"needToBeDeliver":false,"name":"unplanned","delivered":false}]},
    {"name":"Ticket4","releases":[{"needToBeDeliver":false,"name":"unplanned","delivered":false}]}
]

在上面的数组中,我必须检查发布数组是否包含“未计划”条目并且 count(releases.needToBeDeliver == true) > 0,然后从发布数组中取消设置“未计划”条目。

例如

  • 在第一个索引中,它将保持原样,因为它不包含发布数组中的任何计划外条目
  • 在第二个索引中,它包含计划外条目,并且needToBeDeliver值为true超过一次,删除计划外条目
  • 在第三个索引中,它包含计划外条目但needToBeDeliver不等于true,不要删除计划外条目
  • 在第四个索引中,它包含计划外条目但needToBeDeliver 不正确,不要删除计划外条目

O/p 应该跟随

[
    {"name":"Ticket1","releases":[{"needToBeDeliver":true,"name":"release1","delivered":false},{"needToBeDeliver":true,"name":"release2","delivered":false}]},
    {"name":"Ticket2","releases":[{"needToBeDeliver":true,"name":"release1","delivered":false},{"needToBeDeliver":true,"name":"release2","delivered":false}]},
    {"name":"Ticket3","releases":[{"needToBeDeliver":false,"name":"release1","delivered":false},{"needToBeDeliver":false,"name":"unplanned","delivered":false}]},
    {"name":"Ticket4","releases":[{"needToBeDeliver":false,"name":"unplanned","delivered":false}]}
]

到目前为止我所尝试的:

tickets.forEach(ticketsData => {
    var i = 0;
    ticketsData.releases.forEach(release => {
        if(release.needToBeDeliver === true){
            i++;
        }       
    });
});

但我不知道如何在循环中添加第二个条件以检查每个索引的发布数组中是否存在计划外条目。请帮助我继续此操作。

【问题讨论】:

  • 试试这个if(release.needToBeDeliver === true && releases.name == 'unplanned'){
  • @HassanImam,事情是计划外的条目永远不会需要需要交付为真,我们必须检查发布数组中的其他条目,

标签: javascript foreach


【解决方案1】:

要求“count(releases.needToBeDeliver == true) > 0”可以改写为“有一个 .needToBeDeliver == true 的版本”,您可以使用.some

data.forEach(d => {
    if (d.releases.some(r => r.needToBeDeliver))
        d.releases = d.releases.filter(r => r.name !== 'unplanned')
});

【讨论】:

    【解决方案2】:

    使用逻辑运算符可以很容易地检查任何语句中的第二个条件。

    在您的示例中,只需检查

    if(release.needToBeDeliver == true && release.name == "unplanned"){
                i++;
            }
    

    将允许您“过滤掉”需要交付且名称为“未计划”的元素。希望,这就是你要找的。​​p>

    【讨论】:

    • 但计划外的条目永远不会将标志 needToBeDeliver 设为 true。上述条件将检查每个版本的 needToBeDeliver 和名称。我们必须检查发布数组的地方应该有计划外的条目,并且当对发布数组的所有索引计数时,needToBeDeliver 标志的计数为 true 大于一
    【解决方案3】:

    你可以先得到计数,然后过滤releases

    var array = [{ name: "Ticket1", releases: [{ needToBeDeliver: true, name: "release1", delivered: false }, { needToBeDeliver: true, name: "release2", delivered: false }] }, { name: "Ticket2", releases: [{ needToBeDeliver: true, name: "release1", delivered: false }, { needToBeDeliver: true, name: "release2", delivered: false }, { needToBeDeliver: false, name: "unplanned", delivered: false }] }, { name: "Ticket3", releases: [{ needToBeDeliver: false, name: "release1", delivered: false }, { needToBeDeliver: false, name: "unplanned", delivered: false }] }, { name: "Ticket4", releases: [{ needToBeDeliver: false, name: "unplanned", delivered: false }] }];
    
    array.forEach(function (o) {
        var count = o.releases.reduce((s, { needToBeDeliver }) => s + needToBeDeliver, 0);
        o.releases = o.releases.filter(a => !(a.name === 'unplanned' && count));
    });
    
    console.log(array);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案4】:

      我会做以下事情:

      var result = tickets.map(ticket => {
        if (!ticket.releases.some(r => r.needToBeDeliver)) return ticket;
        return Object.assign(ticket, { releases: ticket.releases.filter(r => r.name !== 'unplanned') });
      });
      

      您检查是否存在包含needToBeDeliver 的版本,如果为假,则返回原始版本。如果为 true,则过滤掉任何 unplanned 版本。

      【讨论】:

        猜你喜欢
        • 2022-07-11
        • 2020-10-30
        • 2013-05-27
        • 1970-01-01
        • 2010-12-31
        • 1970-01-01
        • 2016-10-22
        • 2015-09-19
        • 1970-01-01
        相关资源
        最近更新 更多