我怎样才能选择一些JSON对象?

时间:2016-10-02 04:43:03

标签: javascript jquery json

您好我有一个解析本地JSON对象的脚本(目前只是为了显示一个列表)。

public final long UPDATE_INTERVAL_IN_MILLISECONDS = 2000;
public final long UPDATE_FASTEST_INTERVAL_IN_MILLISECONDS = UPDATE_INTERVAL_IN_MILLISECONDS / 2;

locationRequest = new LocationRequest();
locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS );
locationRequest.setFastestInterval(UPDATE_FASTEST_INTERVAL_IN_MILLISECONDS );
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

和JSON对象:

function generateFamilySelect() {
    var implantData = JSON.parse(localStorage.getItem("implantData"));
    var implantFamilies = "";
    $.each(implantData.implantFamilies, function( index, value ) {
        implantFamilies += implantData.implantFamilies[index].familyDisplay + "<br />";
    });
    $("#holderForFamilySelect").html(implantFamilies);
}

目前,该列表显示了所有元素。如何修改此脚本以仅显示{"implantFamilies":[ {"id":"1","familySelector":"aa","familyDisplay":"One","loadInitially":"1"}, {"id":"2","familySelector":"bb","familyDisplay":"Two","loadInitially":"1"}, {"id":"3","familySelector":"cc","familyDisplay":"Three","loadInitially":"1"}, {"id":"4","familySelector":"dd","familyDisplay":"Four","loadInitially":"0"}, {"id":"5","familySelector":"ee","familyDisplay":"Five","loadInitially":"0"}, {"id":"6","fami…

的脚本

另外,一个快速的语法问题,我感觉像行

"loadInitially":"1"

可以写成类似

的内容
implantFamilies += implantData.implantFamilies[index].familyDisplay + "<br />";

但是我无法让它工作......

3 个答案:

答案 0 :(得分:2)

最简单的方法是使用Javascript Array.filter()方法

// (or in your case, you get it from localstorage, but here's the data)
var myJson = {"implantFamilies":[
    {"id":"1","familySelector":"aa","familyDisplay":"One","loadInitially":"1"},
    {"id":"2","familySelector":"bb","familyDisplay":"Two","loadInitially":"1"},
    {"id":"3","familySelector":"cc","familyDisplay":"Three","loadInitially":"1"},
    {"id":"4","familySelector":"dd","familyDisplay":"Four","loadInitially":"0"},
    {"id":"5","familySelector":"ee","familyDisplay":"Five","loadInitially":"0"}] };

//the array of implant families  
 var implantFamilies = myJson.implantFamilies; 

//the filtering function. This is preferable to $.each
 function implantFamiliesThatLoadInitially(implantFamily){
    return implantFamily.loadInitially === '1';
 }

 //this is only the ones you want, (filtered by loadInitially property)
 var loadInitiallyImplantFamilies = implantFamilies.filter(implantFamiliesThatLoadInitially); 

代码的第二部分的目标是基于json中的数据构建一些html,存储在变量implantFamilies中。我将推荐使用Array.map()作为一个更简单的解决方案,而不是处理this。就像之前我用评论将其分成多个步骤,所以很明显发生了什么。

//your map function. You can make any html you want, like li's
function toImplantFamilyHtml(family){
    return family.familyDisplay + '<br />'
}

//returns a plain string of html
var implantFamilyHtml = loadInitiallyImplantFamilies.map(toImplantFamilyHtml);

//jquery object you can use, or append to the DOM or whatever
var $implantFamilyHtml = $(implantFamilyHtml);

//append to DOM
$("#holderForFamilySelect").html($implantFamilyHtml);

工作小提琴:https://jsfiddle.net/mv850pxo/2/

答案 1 :(得分:0)

现在看起来很明显。

$.each(implantData.implantFamilies, function( index, value ) {
    if (implantData.implantFamilies[index].loadInitially == "1") {
        implantFamilies += implantData.implantFamilies[index].familyDisplay + "<br />";
    } else {
        //do nothing
    }
});

我的问题的第二部分怎么样?

答案 2 :(得分:0)

the_5imian has provided a good answer第一个问题,you have determined the obvious alternate solution,根据您当前的代码。

关于你的第二个问题(jQuery.each()this):
jQuery.each()内,this是包裹为对象的valuevalue是当前索引处的数组元素的值,而不是整个数组。换句话说,您不要在此上下文中使用[index]value上的this来获取当前数组元素。对于此代码,valuethis是相同的,因为value已经是对象。

对于你想要的,你可以使用value(假设数组的所有元素都已经是对象,你可以改用this,但使用value是一个更好的习惯进入。):

$.each(implantData.implantFamilies, function( index, value ) {
    if (value.loadInitially == "1") {
        implantFamilies += value.familyDisplay + "<br />";
    } else {
        //do nothing
    }
});

thisvalue包装为对象:
以下内容应显示valuethis的值$.each(array,function(index,value){...});内的值:

var myArray = ['zero','one','two','three','four','five'];

$.each(myArray, function(index,value){
  console.log(index + ' value =',value);
  console.log(index + ' this =',this);  //this is the value wrapped as an Object.
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>