Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中基本上执行“where”子句的最佳方法?_Javascript_Arrays_Json - Fatal编程技术网

在Javascript中基本上执行“where”子句的最佳方法?

在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

我正在尝试解析发送给我的JSON,它的格式都是

[{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"))