基本上在Javascript中执行`where`子句的最佳方法是什么?

时间:2011-08-05 16:28:31

标签: javascript arrays json

我正在尝试解析发送给我的一些JSON,它的格式为

[{key:value},{key2:value2}, ... ]

获得key2的价值的最佳方法是什么?有没有办法在不进行for循环的情况下完成它?

11 个答案:

答案 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函数追加常量_.partialRightkey2返回一个需要一个参数的新函数:要检查的对象。新函数检查_.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'];