在Javascript中基本上执行“where”子句的最佳方法?
我正在尝试解析发送给我的JSON,它的格式都是在Javascript中基本上执行“where”子句的最佳方法?,javascript,arrays,json,Javascript,Arrays,Json,我正在尝试解析发送给我的JSON,它的格式都是 [{key:value},{key2:value2}, ... ] 在这种情况下,获取key2值的最佳方法是什么?有没有不做for循环的方法 不太可能,但是创建一个函数来实现这一点并不困难。然而,它确实会涉及一个for循环 为了完成,这将是功能: function selectWhere(data, propertyName) { for (var i = 0; i < data.length; i++) { if
[{key:value},{key2:value2}, ... ]
在这种情况下,获取
key2
值的最佳方法是什么?有没有不做for循环的方法 不太可能,但是创建一个函数来实现这一点并不困难。然而,它确实会涉及一个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 parsedJSON = JSON.parse(stringJSON);
var value = parsedJSON['key2'];
Regex-循环的编号:
var key2Val = jsonString.match(/\{key2:[^\}]+(?=\})/)[0].substring("{key2:".length);
不能使用数组进行此操作,但可以使用它创建类似对象的关联数组。一旦你做到了,你就可以像散列一样使用它
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
var arr=[{key:value},{key2:value2},…],obj={};
对于(变量i=0,len=arr.length;i
下面是一个原型是数组对象的示例注意:举例说明-find
不是此函数的好名称,可能并非所有数组都需要此名称
相反,只考虑使用函数定义并创建一个函数,如<代码> GETObjave<代码>,调用类似<代码> GETObVALVE(ARR,PrimNeX)< /C> >,类似于劳伦特的回答。 鉴于
定义
用法
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}]
海亚斯。您可以使用lodash库的.reduce()或.transform()函数来实现这一点。Lodash比下划线(下划线约5kb,Lodash约17kb)更模块化,但通常更轻,因为您只包含所需的特定模块 (请参阅:供讨论)。对于本演示,我将导入整个模块(通常在后端不是问题): 我为处理数值和非数值参数的任一场景编写了这些代码段 拉入lodash:
var _ = require('lodash');
\u.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;
}, '');
var where = _.isEmpty(options) ? '' : ' WHERE ', delim = '';
_.transform(options, function(r, v, k) {
where = where + delim + k + '=' + (_.isNumber(v) ? v : ("'" + v + "'"));
delim = ' AND ';
});
\u.transform()到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;
}, '');
var where = _.isEmpty(options) ? '' : ' WHERE ', delim = '';
_.transform(options, function(r, v, k) {
where = where + delim + k + '=' + (_.isNumber(v) ? v : ("'" + v + "'"));
delim = ' AND ';
});
希望这能有所帮助。最上面的答案就行了。下面是使用lodash的一行程序版本(大部分与下划线相同): 在lodash中,select只是过滤器的别名。我将充满对象的数据数组传递给它。我使用
\uhas
作为过滤器函数,因为它正是我们想要的:检查属性是否存在
\ has
需要两个参数:
_.has(object, path)
因为,
\uhas
需要两个参数,我知道其中一个总是常量(路径参数)。我使用\uu.partiOK
函数附加常量key2
<代码>.\u.partOK返回一个新函数,该函数需要一个参数:要检查的对象。新函数检查obj.key2是否存在。Javascript数组附带的方法可以执行您所要求的操作—查找条目,而无需编写for循环代码
你为他们提供你想要的条件。一种简洁方便的方法是使用箭头(或“lambda”)函数。在您的示例中,您正在查找具有特定键的数组项,因此箭头函数可能如下所示:
e => e.hasOwnProperty("key2")
在其他一些人的带领下,让我们从假设开始
var arr = [{key:"value"}, {key2:"value2"}, {key3:"value3"}]
如果希望最多有一个数组成员具有所需的密钥,则可以使用
find()
函数。它将测试每个数组成员,直到找到一个条件为真的数组成员,并返回它。如果没有一个是真的,您将得到未定义的
var foundentry = arr.find(e => e.hasOwnProperty("key2"))
foundentry
将是未定义的
,或者它将是您正在查找的{key2:“value2”}
,并且可以从中提取value2
如果
arr
可以有多个带有您正在查找的密钥的条目,则使用filter()
代替find()
。它将返回符合条件的条目数组
var foundarray = arr.filter(e => e.hasOwnProperty("key2"))
对此对象数组使用.filter()方法,例如在您的情况下:
var objArray=[{key:Hello},{key2:Welcome}];
var key2Value=objArray.filter(x=>x.key2)[0].key2代码>为什么不想使用for循环?有人对Linq上瘾了@第7卷,但它们不能保证像这样井然有序that@Earlz你为什么要避免一个for循环?出于性能原因?还有,你用什么来解析JSON?@rsb我只是想要比循环更干净的东西。你对JSON.parse()有什么问题吗?也许可以尝试parsedJSON.key2K,这样我看到您使用的是数组而不是有效的JSON。。。因此,如果您向函数传递一个有效字符串,您将得到您想要的结果。一些浏览器中不包括JSON.parse(),尤其是mac和更早版本的浏览器。但是,您可以手动将其包括在内。它返回一个对象tho,而不是数组。你可能需要稍微玩弄一下,但我确信你要找的是JSON.parse()。很高兴我得到了neg one tho,而不是在不使用循环时给你一个循环的家伙。这是有效的JSON。我验证了它。也许我的例子不好。这是一段真实的数据剪辑:[{“employername”:“FosTech”},{“from”:“3/14/2008”},{“to”:“5/1/2011”},{“worktype”:“programmin”…]}
K,正确,先生。。。但是您有一个JSON数组,而不是JSON对象。数组以方括号开始,对象以大括号开始。更具体地说,您有一个对象数组或使用JSON表示法的对象文本数组。一个表示数据的JSON对象看起来像…{“employername”:“FosTech”,“from”:“3/14/2008”,“to”:“5/1/2011”,“worktype”:programmin“,…}
K,正确,先生。。。但是您有一个JSON数组,而不是JSON对象。数组以方括号开始,对象以大括号开始。更具体地说,您有一个对象数组或使用JSON注释的对象文本数组
var arr = [{key:"value"}, {key2:"value2"}, {key3:"value3"}]
var foundentry = arr.find(e => e.hasOwnProperty("key2"))
var foundarray = arr.filter(e => e.hasOwnProperty("key2"))