如果我有一个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中思考,数据集不会很大。
答案 0 :(得分:2)
如果您习惯使用Linq,则应该查看filter
和map
方法(大致相当于Linq Where
和Select
方法,分别地):
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
此特定案例的代码是
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 /数组。