【问题标题】:Using jQuery Attribute Starts With Selector in Each Loop在每个循环中使用 jQuery 属性从选择器开始
【发布时间】:2014-05-21 09:51:30
【问题描述】:

我正在检索一个以 JSON 开头的本地存储字符串:

[
    {
        "Key01": "Val01",
        "Key02": "Val02",
        "Key03": "Val03",
        "KeyInfo1": [
            {
                "KIName": "KIVal01",
                "KIId": "KIVal02"
            }
        ],
        "KeyInfo2": [
            {
                "KIName": "KIVal03",
                "KIId": "KIVal04"
            }
        ],
        "KeyInfo3": [
            {
                "KIName": "KIVal05",
                "KIId": "KIVal06"
            }
        ]
    }
]

并将其转换回 JSON 数组:

var stuff = localStorage.getItem("ls");
var testparse = $.parseJSON(stuff);

我希望能够运行 jQuery $.each() 循环以仅隔离名称以“KeyInfo”开头的数组并梳理出它们的数据。我在 HTML 元素上使用了 jQuery 的“属性以选择器开头”功能,这些元素具有现成的选择器,例如 ID 或表单名称,例如:input[name^='news']。 JSON 中是否有这样的选择器?像这样的循环:

$.each(testparse[0]."[key^='KeyInfo']"[0], function(key, value){
        console.log(key + ' = ' + value);
    });

可以理解地抛出一个Uncaught SyntaxError: Unexpected string,因为我在将自己设置为与 $.each() 循环关联的函数中的属性之前尝试访问一个键。这样的场景可行吗?如果没有,有人可以推荐一种方法来隔离那些以“KeyInfo”开头的数组吗?

【问题讨论】:

    标签: jquery arrays json each startswith


    【解决方案1】:

    您可以对每个键进行简单检查,看看它们是否以“KeyInfo”开头。

    $.each(testparse[0], function(key, value){
        if (key.indexOf('KeyInfo') === 0) {
            console.log(key + ' = ' + value);
        }
    });
    

    【讨论】:

      【解决方案2】:

      http://jsfiddle.net/7r6Vu/

      您基本上会得到没有以 keyInfo 开头的键的原始对象。

      var testparse = [
          {
              "Key01": "Val01",
              "Key02": "Val02",
              "Key03": "Val03",
              "KeyInfo1": [
                  {
                      "KIName": "KIVal01",
                      "KIId": "KIVal02"
                  }
              ],
              "KeyInfo2": [
                  {
                      "KIName": "KIVal03",
                      "KIId": "KIVal04"
                  }
              ],
              "KeyInfo3": [
                  {
                      "KIName": "KIVal05",
                      "KIId": "KIVal06"
                  }
              ]
          }
      ]
      
      testparse = $.map(testparse[0], function(value, key) {
          if (key.match(/^KeyInfo/)) {
              var res = {}
              res[key] = value
              return res
          }
      })
      
      console.log(testparse)
      

      【讨论】:

        【解决方案3】:

        像这样使用 jQuery.map ..

        var filtered = $.map( test[0], function( n, i) {
            return /^keyInfo/i.test(i) ? n : null;
        });
        
        $.each(filtered , function(key, value){
            console.log(value);
        });
        

        【讨论】:

          【解决方案4】:

          我试了一下。像这样:

          var keys = Object.keys(testparse[0]);
          
          var result = keys.filter(function(val){
              return !val.indexOf('KeyInfo'); //Isolate/Filter keys
          }).map(function(val, i){
              var res = {}; //Create a new object
              res[val] = testparse[0][val] //Reassign the key/value pairs
              return res;
              //Or maybe do your stuff instead.
          })
          
          console.log(result);
          /*[ { KeyInfo1: [ { KIName: 'KIVal01', KIId: 'KIVal02' } ] },
          { KeyInfo2: [ { KIName: 'KIVal03', KIId: 'KIVal04' } ] },
          { KeyInfo3: [ { KIName: 'KIVal05', KIId: 'KIVal06' } ] } ]*/
          

          编辑: 注意 array.map 和 array.filter 是 ECMAScript 5 的一部分,不能在旧浏览器中工作。您可以将这些更改为 jquery 等效的 $.map 和 $.filter。 不幸的是,我的实验室 atm 中没有可用的 jquery。 ;)

          【讨论】:

            猜你喜欢
            • 2017-06-15
            • 1970-01-01
            • 1970-01-01
            • 2021-03-11
            • 1970-01-01
            • 1970-01-01
            • 2021-02-13
            • 2010-12-17
            • 1970-01-01
            相关资源
            最近更新 更多