JavaScript 查询和投影库

标签 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'
        }]
    }]
}

我想说的是,查看房子中的所有房间,找到 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/

相关文章:

javascript - 将unicode转为汉字

javascript - QuickBlox QB.chat.connect 突然给出令人困惑的身份验证错误代码 401

php - 如何通过对多列进行分组来制作 jQuery 网格 - PHP?

node.js - 如何将sentry与node的kue一起使用?

javascript - 在 Electron 中捕获、修改然后输出音频

node.js - Apache Deft、Webbit 和 Vert.x 之间的区别

javascript - 使用 Promise 进行异步编码

javascript - 动态绘制多个图表时不显示 Google Chart

javascript - 意外的 Chrome 自动填充行为 [禁用 Chrome 自动填充]

javascript - Jest SecurityError : localStorage is not available for opaque origins