2013-05-15 77 views
3

我有JSON字符串:如何获得JSON对象的指数

var Str="[{ 'label': 'Month'},{ label: 'within'},{ label: 'From'}, 
     { label: 'Where'},]"; 

我把它转换成JSON对象为:

 var tagString = eval(Str); 

我想获得一个月的指标,而不循环

有没有更好的方式来获取对象的索引而不使用循环?

在此先感谢!

+4

的代码段这不是JSON。但是你应该使用'JSON.parse'而不是'eval' ... – elclanrs

+0

我不这么认为,用给定的数据结构你需要循环 –

+0

如果我使用JSON.parse它会给出这样的JSON错误。解析:期望的属性名称或'}' –

回答

10

如果这些都是标签,你可以像这样改变结构,所以它是“一系列标签”,在我看来,它会更合适。

var Str = '["Month","within","From","Where"]'; 

然后用JSON.parse解析它他们,或者因为你使用jQuery,$.parseJSON让它在更多的浏览器工作:

var labels = JSON.parse(Str); 

labels现在应该是一个数组,您可以使用Array.indexOf

var index = labels.indexOf('Month'); 

It's ES5和大多数现代浏览器都支持它。对于旧版浏览器,you need a polyfill不幸的是...也使用循环。

+0

如果我使用var index = labels.indexOf('Month');它返回-1 –

+0

@amol [Works here](http://jsfiddle.net/XCEtn/)。你一定错过了一些东西。 – Joseph

+0

看到这个小提琴,为什么这给了-1 http://jsfiddle.net/amol_0504/G2JW7/ –

22

不要使用eval解析json!使用JSON.parseArray.map是一个很好的替代循环在这里:

var str = '[{ "label": "Month"}, { "label": "within"}, { "label": "From"}, { "label": "Where"}]'; 
var data = JSON.parse(str); 
var index = data.map(function(d) { return d['label']; }).indexOf('Month') 

jsFiddle

+0

但是你的解决方案是迭代数组。 – vdua

+0

@vdua:是的,这是搜索列表的唯一方法。 – Eric

+0

这是正确的,我误解了这个问题,并假定他不想迭代数组。我的错。不管怎么说,多谢拉 – vdua

1

注意:如果你想通过它的价值得到JSON中的特定项目,我遇到了这个答案,想着分享。

您可以使用Array.splice()

首先为@elclanrs和@Eric提到,在使用JSON.parse()来;

var Str = '[{ "label": "Month"}, { "label": "within"}, { "label": "From"}, { "label": "Where"}]'; 

var item = JSON.parse(Str); 

item = item.splice({label:"Month"},1); 

及其ES5。

看到这里

var Str = '[{ "label": "Month"}, { "label": "within"}, { "label": "From"}, { "label": "Where"}]'; 
 
var item = JSON.parse(Str); 
 

 
item = item.splice({label:"Month"},1); 
 

 
console.log(item);