【问题标题】:Loop through JSON objects that only start with a certain pattern循环遍历仅以特定模式开头的 JSON 对象
【发布时间】:2014-07-22 19:01:42
【问题描述】:

循环遍历仅以特定模式开头的 JSON 对象的正确/惯用方式是什么?

示例:假设我有一个类似 JSON 的

{
  "END": true, 
  "Lines": "End Reached", 
  "term0": {
    "PrincipalTranslations": {
      // nested data here
    }
  },
  "term1": {
    "PrincipalTranslations": {
      // more nested data here
    }
  }
}

我只想访问PrincipalTranslations 对象,我尝试过:

$.each(translations, function(term, value) {
    $.each(term, function(pos, value) {
        console.log(pos);
    });
});

这不起作用,可能是因为我无法遍历 ENDLines 对象。

我尝试过类似的东西

$.each(translations, function(term, value) {
    $.each(TERM-THAT-STARTS-WITH-PATTERN, function(pos, value) {
        console.log(pos);
    });
});

使用wildcards,但没有成功。我可以尝试弄乱if 语句,但我怀疑我错过了一个更好的解决方案。谢谢。

【问题讨论】:

  • 你不能在那里使用通配符,$.each 只是循环一个数组或一个对象的键。您必须使用其他东西(例如 if 语句)进行过滤。
  • 如果可能,更改 JSON 结构会容易得多。您能否更改格式以包含 terms 数组,而不是每个都有自己的属性?
  • 仅供参考,value 将是要迭代的对象,term 是属性名称。查看文档:api.jquery.com/jquery.each
  • 由于 API 请求,我得到了 JSON,所以是的,我可以在后端重新安排整个事情。由于我是网络开发新手,我只是假设 API 是正确的,但问题出在我身上:]

标签: javascript jquery json jquery-selectors


【解决方案1】:

如果您只对PrincipalTranslations-objects 感兴趣,以下方法可以解决问题:

$.each(translations, function(term, value) {
    if (value.PrincipalTranslations !== undefined) {
        console.log(value.PrincipalTranslations);
    }
});

JSFiddle

【讨论】:

    【解决方案2】:

    如何在对象中搜索属性是这样的:

    var obj1 ={ /* your posted object*/};
    
    
    // navigates through all properties
    var x = Object.keys(obj1).reduce(function(arr,prop){
    // filter only those that are objects and has a property named "PrincipalTranslations"
        if(typeof obj1[prop]==="object" &&  Object.keys(obj1[prop])
            .filter(
                function (p) {
                    return p === "PrincipalTranslations";})) {
                         arr.push(obj1[prop]);
                    }
        return arr;
    },[]);
    
    console.log(x);
    

    【讨论】:

    • 这很有趣,谢谢。如果我决定重新排列 API 响应,您会说在您的示例中的客户端还是服务器端更好?
    • @laurids 这适用于任何早于 IE9 的浏览器,如果你在任何浏览器上进行 polyfill
    • 其实我更关心哪一个是“好的做法”而不是可移植性 ;)
    • 这种方法使用 ES5 标准。如果您想使用 jQuery、Underscore 或 lodash,它将依赖库来提供“可移植性”,这可能与这些天大致相同。
    猜你喜欢
    • 2018-05-03
    • 2023-03-26
    • 1970-01-01
    • 2019-02-03
    • 2021-10-07
    • 2015-09-16
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多