如何在数组中找到对象的索引

6

我有一个JSON字符串如下:

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

我通过eval将其转换为对象:

      var tagString = eval(Str); 

我希望不使用循环就能获取月份的索引。

有没有更好的方法在不使用循环的情况下获取数组中对象的索引?

提前感谢!


4
那不是JSON。但你仍应该使用JSON.parse,而不是eval... - elclanrs
如果我使用JSON.parse,它会给出以下错误:JSON.parse:预期属性名称或'}'。 - amol challawar
2
因为它不是正确的JSON格式。所有引号都应该是双引号,而且我认为尾随逗号也是无效的。 - elclanrs
我已经成功将它转换为JSON.parse,但是如何获取“month”字段的索引? - amol challawar
1
“不使用循环”和“不迭代”不是同义词 - 内置函数允许您表达无需使用 forwhile 的东西,就像我的答案一样。 - Eric
显示剩余4条评论
4个回答

27

不要使用eval来解析JSON数据!使用JSON.parse。在这里,Array.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


但是你的解决方案正在迭代数组。 - vdua
@vdua:是的,那是搜索列表的唯一方法。 - Eric
没错,我误解了问题,并假设他不想迭代数组。我的错。无论如何还是谢谢。 - vdua

14
如果这些都是标签,你可以像这样更改结构,使其成为“标签数组”,在我看来这样更合适。
var Str = '["Month","within","From","Where"]';

然后使用JSON.parse对其进行解析,或者由于您正在使用jQuery,请使用$.parseJSON来使其适用于更多的浏览器:

var labels = JSON.parse(Str);

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

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

它是ES5,并且现代大多数浏览器都支持它。对于旧版本的浏览器,您需要一个polyfill,但不幸的是... 它也使用循环。


如果我使用 var index = labels.indexOf('Month');,它会返回 -1。 - amol challawar
@amol 我的回答建议您更改数据结构。 - Joseph
@Eric 我不能更改这个数据结构,因为我正在使用视觉搜索插件,它需要像我在问题和fiddle中给出的json对象。 - amol challawar

2
注意:如果您想通过其值获取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);


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接