查询具有多个参数的JavaScript对象

时间:2014-01-06 20:47:39

标签: javascript json

如果我有一个JavaScript对象:

var people = {
    items: [
        { id: "1", name: "j", age: "11", gender: "m"},
        { id: "2", name: "k", age: "22", gender: "f"},
        { id: "3", name: "l", age: "33", gender: "m"},
        { id: "4", name: "m", age: "44", gender: "f"},
        { id: "5", name: "n", age: "55", gender: "m"}
    ]
};

有没有办法可以检索单个“记录”?它需要什么样的数据类型?

如果我想要'年龄'和'性别'(id = 4和name = m),我该怎么做?

我知道这个设计可能不太理想,但我在LINQ中思考,数据集不会很大。

4 个答案:

答案 0 :(得分:2)

如果您习惯使用Linq,则应该查看filtermap方法(大致相当于Linq WhereSelect方法,分别地):

var person = people.items
    .filter(function(x) { return x.id == "4" && x.name == "m"; })
    .map(function(x) { return { age: x.age, gender: x.gender }; })[0];

但这是在ES5中引入的,因此在某些旧版浏览器中无法使用。如果这是一个问题,你必须使用普通的for - 循环:

var person;
for (var i = 0; i < people.items.length; i++)
{
    if (people.items[i].id == "4" && people.items[i].name == "m")
    {
        person = { age: people.items[i].age, gender: people.items[i].gender };
        break;
    }
}

答案 1 :(得分:2)

像这样:

var personID4 =  people.items.filter(function(person)
{ 
    return person.id === "4";
});

var personID4 =  people.items.filter(function(person)
{ 
    return person.name === "m"; 
});

或您需要的组合:

var personID4 =  people.items.filter(function(person)
{ 
    return person.id === "4" && person.name === "m"; 
});

重要: 建议使用“===”而不是“==”,因为5不等于“5”。 Double equal会将此值评为true,如果是这种情况,则可以使用“==”。

此外,这适用于IE9 +,如果您需要在IE8或更早版本中运行,请按照此链接中的polyfill说明操作: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

答案 2 :(得分:1)

纯javascript FIDDLE

function getPeopleById(id){
    for(var i=0; i< people.items.length; i++){
        if(people.items[i].id == id){
            return people.items[i];
        }
    }
}

alert(getPeopleById(4).name)

答案 3 :(得分:0)

重用LINQ习惯的好方法是使用linq.js

http://linqjs.codeplex.com/

此特定案例的代码是

Enumerable.From( people.items )
   .Where( function(x) { return x.id == "4" && x.name == "m" } )
   .ToArray();

甚至

Enumerable.From( people.items )
   .Where( 'x => x.id == "4" && x.name == "m"' )
   .ToArray();

作为使用此库的副作用,您可以使用已知的其他LINQ运算符。

  
    

有没有办法可以检索单个“记录”?它需要什么样的数据类型?

  

在Javascript中没有“数据类型”的概念,或者更确切地说,在某种意义上你可能不希望它存在。您只需获得一组共享公共属性的set / list /数组。