2016-10-02 129 views
0

嗨我有一个脚本解析本地JSON对象(目前只是为了显示一个列表)。我怎样才能只选择一些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); 
} 

和JSON对象:

{"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 />"; 

可以写成像

implantFamilies += this[index].familyDisplay + "<br />"; 

,但我不能得到那个工作...

+0

你必须在之前检查这种情况添加到变量'implantFamilies' –

+1

正如一个注释:当你使用JSON字符串时,一旦你解析它,你有一个JavaScript对象。有没有这样的事情作为JSON对象;) –

+0

澄清@JeremyJStarcher说。 JSON字面意思是“Javascript Object Notation”。当然,它的迂腐。我甚至经常听到它,但类似于说“ATM机”。首字母缩略词已经说明它是一个对象,就像ATM的首字母缩写词已经声明它是一台机器。另见:“PIN号码”等 –

回答

0

the_5imian has provided a good answer你的第一个问题,you have determined the obvious alternate solution,鉴于你目前的代码。

至于第二个问题(thisjQuery.each()):
jQuery.each()thisvalue缠绕为对象。 value是当前索引处的数组元素的值,而不是整个数组。换句话说,在此上下文中,您不使用valuethis上的[index]来获取当前数组元素。对于此代码,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>

0

那好吧,现在看起来很明显。

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

我的问题的第二部分如何?

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数据,存储在格兰可变implantFamilies一些HTML。我会推荐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/

+0

感谢您的回答。我将另一个标记为解决方案,因为它回答了我的原始问题,但是此信息非常有用。我不知道map(),它看起来会派上用场!谢谢! – Brad

+0

我会告诉你,当你认为你需要这个''这个'时,在JavaScript中9/10次,你可能不会。它很适合委派,除此之外,它更喜欢像'filter','map','reduce'这样的纯函数。 –

相关问题