我正在寻找一些语法或库来帮助我查询JavaScript对象,并将结果投影到类似于C#LINQ中可以实现的结果。
例如:
{
name: 'House',
rooms: [{
name: 'Bedroom',
items: [{
id: 1,
name: 'Bed'
}, {
id: 2,
name: 'Chair'
}, {
id: 3,
name: 'Lamp'
}]
}, {
name: 'Bathroom',
items: [{
id: 4,
name: 'Bath'
}, {
id: 5,
name: 'Shower'
}, {
id: 6,
name: 'Cupboard'
}]
}]
}
我想说看看House里的所有房间,找到id为2的物品,然后只给我这个物品。
所以结果将是
{
id: 2,
name: 'Chair'
}
有关最佳库的建议以及我将用于实现此目的的语法将非常感激。
答案 0 :(得分:1)
图书馆建议特别偏离SO,但您也要求"语法,"这样:
使用rooms
Array.prototype.find
上items
的{{1}}数组条目进行简单循环即可:
function findItem(data, id) {
let found = null;
data.rooms.some(room => {
found = room.items.find(item => item.id == id);
return found != null;
});
return found;
}
直播示例:
const data = {
name: 'House',
rooms: [{
name: 'Bedroom',
items: [{
id: 1,
name: 'Bed'
}, {
id: 2,
name: 'Chair'
}, {
id: 3,
name: 'Lamp'
}]
}, {
name: 'Bathroom',
items: [{
id: 4,
name: 'Bath'
}, {
id: 5,
name: 'Shower'
}, {
id: 6,
name: 'Cupboard'
}]
}]
};
function findItem(data, id) {
let found = null;
data.rooms.some(room => {
found = room.items.find(item => item.id == id);
return found != null; // Or `return !!found;`
});
return found;
}
console.log(findItem(data, 2));

使用Array.prototype.some
循环浏览rooms
中的条目,直到找到内容为止,并在其回调中使用Array.prototype.find
查找具有匹配id
值的项目
它也可以写得更简洁,也许牺牲清晰度:
function findItem(data, id) {
let found = null;
data.rooms.some(room => !!(found = room.items.find(item => item.id == id)));
return found;
}
以上使用ES2015 +的箭头功能。如果您还不能使用ES2015功能,请参阅ES5版本:
function findItem(data, id) {
var found = null;
data.rooms.some(function(room) {
found = room.items.find(function(item) { return item.id == id; });
return found != null;
});
return found;
}