我正在尝试解析发送给我的一些JSON,它的格式为
[{key:value},{key2:value2}, ... ]
获得key2
的价值的最佳方法是什么?有没有办法在不进行for循环的情况下完成它?
答案 0 :(得分:9)
您可以使用Select库中的Underscore.js功能。
答案 1 :(得分:5)
不是真的,但创建一个函数并不难。但是,它确实涉及for
循环。
为了完成,那将是函数:
function selectWhere(data, propertyName) {
for (var i = 0; i < data.length; i++) {
if (data[i][propertyName] !== null) return data[i][propertyName];
}
return null;
}
用法:
var key2value = selectWhere(data, "key2");
答案 2 :(得分:4)
jQuery grep()是Where子句的一个很好的模拟:
var array = [{key:1},{key:2}, {key:3}, {key:4}, {key:5}];
var filtered = jQuery.grep(array, function( item, index ) {
return ( item.key !== 4 && index > 1 );
});
您过滤的数组将包含两个元素
[{key:3}, {key:5}]
答案 3 :(得分:2)
你不能用数组来做,但你可以用它来创建一个像对象一样的关联数组。一旦你做到了,你可以像哈希一样使用它。
var arr = [{key:value},{key2:value2}, ... ], obj = {};
for (var i = 0, len = arr.length; i < len; i++) {
$.extend(obj, arr[i]);
}
console.log(obj.key2); // value2
答案 4 :(得分:1)
这是一个原型是Array对象的例子。 注意: 例如显示 - find
对于此函数来说不是一个好名字,并且所有数组可能都不需要这样做< / em>的
相反,请考虑使用函数定义并创建类似getObjVal
的函数,调用getObjVal(arr,'propName')
,类似于LaurenT的答案。
var arr = [{key:'value'},{key2:'value2'}];
// for-loop example
Array.prototype.find = function (prop){
for(var i=this.length; i--; )
if (typeof this[i][prop] !== 'undefined')
return this[i][prop];
return undefined;
}
// for-each loop example
Array.prototype.find = function (prop){
for (var i in this)
if ( this.hasOwnProperty(i) && typeof this[i][prop] !== "undefined" )
return this[i][prop];
return undefined;
}
console.log( arr.find('key2') ); // 'value2'
console.log( arr.find('key3') ); // undefined
答案 5 :(得分:0)
正则表达式 - 不用于循环:
var key2Val = jsonString.match(/\{key2:[^\}]+(?=\})/)[0].substring("{key2:".length);
答案 6 :(得分:0)
Heyas。您可以使用lodash库的 .reduce() 或 .transform()实现这一目的的功能。 Lodash比下划线更模块化(Underscore约5kb,Lodash约17kb),但通常更轻,因为您只包含您需要的特定模块 (请参阅:https://news.ycombinator.com/item?id=9078590进行讨论)。在本演示中,我将导入整个模块(通常不是后端的问题): 我为这两个处理数字和非数字参数的场景编写了这些片段。
https://lodash.com/docs#reduce
https://lodash.com/docs#transform
拉入lodash:
var _ = require('lodash');
_。reduce()到where子句:
var delim = ' WHERE ', where = _.isEmpty(options) ? '' : _.reduce(options, function(r, v, k) {
var w = r + delim + k + '=' + (_.isNumber(v) ? v : ("'" + v + "'"));
delim = ' AND ';
return w;
}, '');
_。transform()到where子句:
var where = _.isEmpty(options) ? '' : ' WHERE ', delim = '';
_.transform(options, function(r, v, k) {
where = where + delim + k + '=' + (_.isNumber(v) ? v : ("'" + v + "'"));
delim = ' AND ';
});
希望有所帮助。
答案 7 :(得分:0)
最佳答案完成了这项工作。这是使用lodash的单线版本(大部分与下划线相同):
AAA
在lodash中,select只是filter的别名。我传递了充满对象的数据数组。我使用var result = _.filter(data, _.partialRight(_.has, 'key2'));
作为过滤函数,因为它完全符合我们的要求:检查属性是否存在。
_.has
需要两个参数:
_.has
由于_.has(object, path)
需要两个参数,我知道其中一个参数始终是常量(路径参数)。我使用_.has
函数追加常量_.partialRight
。 key2
返回一个需要一个参数的新函数:要检查的对象。新函数检查_.partialRight
是否存在。
答案 8 :(得分:0)
Javascript Array附带的方法可以满足您的要求-无需编写for循环即可查找条目。
您可以为他们提供所需的条件。一种紧凑且方便的方法是使用箭头(或“ lambda”)功能。在您的情况下,您正在寻找具有特定键的数组条目,因此arrow函数可能看起来像这样:
e => e.hasOwnProperty("key2")
在其他一些人的领导下,让我们从假设开始
var arr = [{key:"value"}, {key2:"value2"}, {key3:"value3"}]
如果您期望数组中最多有一个成员具有所需的键,则可以使用find()
函数。它将测试每个数组成员,直到找到条件满足的条件,然后将其返回。如果不正确,您将得到undefined
。
var foundentry = arr.find(e => e.hasOwnProperty("key2"))
foundentry
将是undefined
,或者是您要寻找的{key2:"value2"}
,并可以从中提取value2
。
如果arr
可以包含多个您要查找的键,那么请使用find()
代替filter()
。它会返回一系列符合您条件的条目。
var foundarray = arr.filter(e => e.hasOwnProperty("key2"))
答案 9 :(得分:0)
为此对象数组使用 .filter() 方法,例如在您的情况下:
var objArray = [{key:"Hello"},{key2:"Welcome"} ];
var key2Value=objArray.filter(x=>x.key2)[0].key2;
答案 10 :(得分:-1)
试试这个:
var parsedJSON = JSON.parse(stringJSON);
var value = parsedJSON['key2'];