JavaScript查询和投影库

时间:2017-09-01 10:59:01

标签: javascript node.js

我正在寻找一些语法或库来帮助我查询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'
}

有关最佳库的建议以及我将用于实现此目的的语法将非常感激。

1 个答案:

答案 0 :(得分:1)

图书馆建议特别偏离SO,但您也要求"语法,"这样:

使用rooms Array.prototype.finditems的{​​{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;
}