2012-01-02 43 views
1

可能重复:
Find object by id in array of javascript objects等效的JavaScript/Ruby的语法的jQuery

我可以做到这一点,以获得从一个数组的哈希,其中特定键具有一定的价值特定哈希。例如,如果我想获得散列结果,其中关键id是2的name价值,我可以这样做:

array = [{:id => 1, :name => "A"}, 
     {:id => 3, :name => "C"}, 
     {:id => 2, :name => "B"}] 
id_2_hash = array.detect {|a| a[:id] == 2} 
=> {:id => 2, :name => "B"} 
id_2_hash[:name] 
=> "B" 

我想同样做一个JSON对象是这样的:

[ 
    { 
    'id': 1, 
    'name': 'A' 
    }, 
    { 
    'id': 3, 
    'name': 'C' 
    }, 
    { 
    'id': 2, 
    'name': 'B' 
    } 
] 

我该如何在Javascript/JQuery中做到这一点?

+0

您是使用下划线还是等效函数库? – tokland 2012-01-02 16:17:11

回答

0
var items = [ 
    { 
    'id': 1, 
    'name': 'A' 
    }, 
    { 
    'id': 3, 
    'name': 'C' 
    }, 
    { 
    'id': 2, 
    'name': 'B' 
    } 
]; 
console.log(items.filter(function(v) { 
    return v.id == 2; 
})[0].name); 

UPDATE:注意阵列#过滤器不能在IE 8及以下

+1

如果您要指定某人使用像Array#filter这样的新功能,您确实需要告诉他们它有多新(在ECMAScript5中添加),并且它不受浏览器版本支持,例如50%的人目前正在使用。 (它甚至不在IE9中。) – 2012-01-02 13:09:16

+0

@ T.J.Crowder感谢您指出。顺便说一句,它似乎IE9支持'阵列#过滤器',根据此表http://kangax.github.com/es5-compat-table/ – qiao 2012-01-02 13:22:31

+0

MDN还表示,它在IE9中可用:https://developer.mozilla。 org/en/JavaScript/Reference/Global_Objects/Array/filter#Browser_compatibility – 2012-01-02 13:28:56

0

heare工作是一个简单的sollution,但我敢肯定有更好的.. 保存到一个.js文件并运行。 如果您不使用Windows,请移除WScript.Echo以对其进行测试。 请注意,我不使用过滤器,因为在所有版本的javascript中都不支持。

var obj = [{ 
    'id': 1, 
    'name': 'A' 
    }, 
    { 
    'id': 3, 
    'name': 'C' 
    }, 
    { 
    'id': 2, 
    'name': 'B' 
    } 
] 

for (i=0;i<obj.length;i++){ 
    if (obj[i].id==2){ 
    WScript.Echo(obj[i].name); 
    } 
} 
1

使用[] .filter();

/** 
    * @param {Function} fn is Callback-function 
    * @param {Object} Object to use as this when executing callback 
    * @link {forEach} 
    * @return {Array} Creates a new array with all elements that pass the test implemented by the provided function 
    * @edition ECMA-262 5th Edition, 15.4.4.20 
    */ 
    (function($) { 
     'use strict'; 

     if(!$.filter) { 
      $.filter = function(fn, object) { 
       var length = this.length, 
        array = [], 
        i = -1; 

       while(i++ < length) { 
        if(i in this && fn.call(object, this[i], i, this)) { 
         array.push(this[i]); 
        } 
       } 
       return array; 
      }; 
     } 

    })(Array.prototype);