您好我有一个解析本地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 />";
但是我无法让它工作......
答案 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);
答案 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
是包裹为对象的value
。 value
是当前索引处的数组元素的值,而不是整个数组。换句话说,您不要在此上下文中使用[index]
或value
上的this
来获取当前数组元素。对于此代码,value
和this
是相同的,因为value
已经是对象。
对于你想要的,你可以使用value
(假设数组的所有元素都已经是对象,你可以改用this
,但使用value
是一个更好的习惯进入。):
$.each(implantData.implantFamilies, function( index, value ) {
if (value.loadInitially == "1") {
implantFamilies += value.familyDisplay + "<br />";
} else {
//do nothing
}
});
this
是value
包装为对象:
以下内容应显示value
和this
的值$.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>