【问题标题】:Fire only once if key is found inside a JSON object如果在 JSON 对象中找到密钥,则仅触发一次
【发布时间】:2019-04-24 09:01:08
【问题描述】:

我有一个 JSON 产品对象。在对象中,我想检查是否有任何产品将featured 键设置为true。如果密钥存在于对象中的任何位置,我想在结果上方一次添加一个h3

假设我有一个包含 4 个产品的对象,其中一个产品的 featured 键设置为 true,我将如何调整此代码以使 h3 只添加一次(目前它被全部添加 4次)?

var searchResult = '';
$.each(products, function (id, product) {
    if (products[id].featured) { searchResult += '<h3>Featured</h3>'; }
});

【问题讨论】:

  • 没有 JSON 对象这样的东西。您要么有一个 JSON 字符串,要么有一个 JavaScript 对象(文字)。至于你的问题:if (products.some(p =&gt; p.featured)) ...

标签: javascript json each


【解决方案1】:

$.each 回调中添加return false 以打破循环

var searchResult = '';
$.each(products, function (id, product) {
    if (products[id].featured) { 
        searchResult += '<h3>Featured</h3>'; 
        return false;
    }       
});

您可以改用Array#find()Array#some() 来缩短此时间

var searchResult = '';
var featured =  products.some(function(prod){ return prod.featured});
if(featured){
   searchResult += '<h3>Featured</h3>'; 
}

【讨论】:

    【解决方案2】:

    只需有一个变量来为您保留featured 状态,如果匹配,则在循环中对其进行修改

    var searchResult = '';
    var featured = false;
    $.each(products, function (id, product) {
        if (products[id].featured) { featured = true; }
    });
    
    if(featured === true){
        searchResult += '<h3>Featured</h3>';
    }
    

    【讨论】:

    • 1. if (product.featured) 2. if (featured) 3. Array.some 4. 使用return false;退出循环
    • 似乎没有必要在找到满足条件的产品后继续循环浏览产品。如果有 1000 种产品并且第一个是特色产品,那么您进行的 999 次迭代太多了。
    • 如果这是该功能的唯一目的,是的。但是我可以使用循环对 OP 进行成像,以遍历所有元素,并且只想为其添加额外的功能。这就是这个答案会有所帮助的情况,否则@charlietfl 的答案会更好。
    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2021-07-27
    • 2011-11-19
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多