我正在寻找一些语法或库来帮助我查询 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'
}]
}]
}
我想说的是,查看房子中的所有房间,找到 id 为 2 的元素,然后仅将这个元素返回给我。
所以结果是
{
id: 2,
name: 'Chair'
}
任何关于最好的库以及我将使用什么语法来实现这一目标的建议将不胜感激。
最佳答案
库建议对于 SO 来说是专门偏离主题的,但您还要求提供“语法”,因此:
只需在 items
上使用 Array.prototype.find
来遍历 rooms
数组的条目即可:
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;
}
关于JavaScript 查询和投影库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45998778/