代码之家  ›  专栏  ›  技术社区  ›  Thevagabond

使用返回选定部分的JavaScript解析JSON数组

  •  0
  • Thevagabond  · 技术社区  · 11 年前

    我有一个非常简单的json数组的snipplet和一个javascript函数,现在返回一个参数:

    <!DOCTYPE html>
    <html>
    <body>
    
    <h2>JSON Array Test</h2>
    
    <p id="outputid"></p>
    
    <script>
    var arrayinput = '{"collection":[' +
    '{"firstAttr":"XXXA","secAttr":"13156161","lastAttr":"01" },' +
    '{"firstAttr":"XXXB","secAttr":"11153325","lastAttr":"02"  },' +
    '{"firstAttr":"XXXC","secAttr":"14431513","lastAttr":"03"  },' +
    '{"firstAttr":"XXXC","secAttr":"161714","lastAttr":"01"  },' +
    '{"firstAttr":"XXXC","secAttr":"151415","lastAttr":"02"  },' +
    '{"firstAttr":"XXXC","secAttr":"114516","lastAttr":"02"  },' +
    '{"firstAttr":"XXXC","secAttr":"131417","lastAttr":"03"  },' +
    '{"firstAttr":"XXXC","secAttr":"1311865","lastAttr":"03"  },' +
    '{"firstAttr":"XXXC","secAttr":"1314153","lastAttr":"01"  },' +
    '{"firstAttr":"XXXC","secAttr":"13312163","lastAttr":"01"  }]}';
    
    obj = JSON.parse(arrayinput);
    document.getElementById("outputid").innerHTML =
    obj.collection[1].firstAttr + " " + obj.collection[1].secAttr;
    </script>
    
    </body>
    </html>
    

    现在的问题是,我不想只返回一个值,而是返回多个值。例如,所有具有 lastAttr=01 应返回。

    因此,我需要以下内容:

    for(var i in obj) {                    
        if(lastAttr[i]="01") {
            document.getElementById("outputid").innerHTML =
            obj.collection[i].firstAttr + " " + obj.collection[i].secAttr;
        } else {
    
        }
    }
    

    你知道怎么做吗?

    3 回复  |  直到 11 年前
        1
  •  1
  •   Matías Fidemraizer    11 年前

    如果要执行 哪里 你需要使用 Array.prototype.filter :

    var filteredArr = arr.collection.filter(function(item) {
       return item.lastAttr == "01";
    });
    

    最后,您可以使用 Array.prototype.forEach 迭代结果并执行某些操作:

    var outputElement = document.getElementById("outputid");
    filteredArr.forEach(function(item) {
        // Check that I used insertAdyacentHtml to be sure that all items
        // will be in the UI!
      outputElement.insertAdjacentHTML("afterbegin", item.firstAttr + " " + item.secAttr);
    });
    

    而且,你可以做到 流利地 :

    var arr = {
      collection: [{
        firstAttr: "hello",
        secAttr: "world",
        lastAttr: "01"
      }, {
        firstAttr: "hello 2",
        secAttr: "world 2",
        lastAttr: "01"
      }]
    };
    
    var outputElement = document.getElementById("outputid");
    var filteredArr = arr.collection.filter(function(item) {
      return item.lastAttr == "01";
    }).forEach(function(item) {
      outputElement.insertAdjacentHTML("afterbegin", item.firstAttr + " " + item.secAttr);
    });
    <div id="outputid"></div>
        2
  •  1
  •   user1106925    11 年前

    您需要遍历 collection 数组并追加新内容。现在您正在迭代外部对象并覆盖 .innerHTML 每次。

    var out = document.getElementById("outputid");
    
    for (var i = 0; i < obj.collection.length; i++) {                    
        if(obj.collection[i].lastAttr=="01") {
            out.insertAdjacentHTML("beforeend", obj.collection[i].firstAttr + " " + obj.collection[i].secAttr);
        }
    }
    

    注意,我使用了 == 而不是 = 用于比较,以及 .insertAdjacentHTML 而不是 .innerHTML .

        3
  •  0
  •   Hrabia    11 年前

    如果要替换html,请尝试以下操作

    (someCollection) array;
     var r = new Array();
        var j = -1;
        r[++j] = '<ul class="list-group">';
        for (var i in array) {
            var d = array[i];
            if (d.attribute== somevalue) {
                r[++j] = '<li class="list-group-item">'
                r[++j]=d.otherattribute;
                r[++j] = '</li>';
            }
        }
        r[++j] = '</ul>';
        //for(var b in r) //alert to see the entire html code
        //{ alert(r[b]);}
        firstLoadOnPage = false;
        var list = document.getElementById('SymptomSection');
        list.innerHTML = r.join('');
    

    这将用类名“SymptomSection”替换元素内部