【问题标题】:Return value from Object match对象匹配的返回值
【发布时间】:2012-11-05 22:45:38
【问题描述】:

我绝不是流利的 JS,所以如果我要求一些非常基本的东西,请原谅我,但我无法找到我的问题的正确答案。

我正在编写我的第一个 Node.js(加上 Extra Framework 和 Socket.io)应用程序,并且我在设置类似 FB 的 Messenger 的服务器端时获得了一些乐趣(惊喜!!!)。

所以,假设我有这个数据结构来存储在线用户(这是一个 JSON 数组,但我不确定这是最好的方法还是应该使用 Javascript 对象):

[
  {
    "site": 45,
    "users": [
        {
            "idUser": 5,
            "idSocket": "qwe87r7w8qwe",
            "name": "Carlos Ray Norris"
        },
        {
            "idUser": 6,
            "idSocket": "v8d9d0fgfs7d",
            "name": "John Connor"
        }
    ]
},
{
    "site": 48,
    "users": [
          {
            "idUser": 22,
            "idSocket": "qwe87r7w8qwe",
            "name": "David Bowie"
          },
          {
            "idUser": 23,
            "idSocket": "v8d9d0fgfs7d",
            "name": "Barack H. Obama"
          }
      ]
  }
]

我想要做的是在数组中搜索给定 y 的 x 值。在这种情况下,检索 idSocket 知道 idUser 无需必须遍历数组值。

所以我基本上有两个问题:首先,在线存储用户的正确方法是什么?其次,如何找到与我已经知道的值匹配的值(找到具有给定 idUser 的 idSocket)。

我想要一个纯 JS 方法(或使用 Node、Socket.io 或 Express 提供的一些工具),但如果这不可能,那么我可以寻找一些 JQuery。

编辑 听了chovy的建议,稍微修改了一下结构,现在是这个样子

{
  45: { // site
    05: { // userId
        "name": "Carlos Ray Norris",
        "socketID": "qwe87r7w8qwe"
    },
    06: {
        "name": "John Connor",
        "socketID": "v8d9d0fgfs7d"
    }
},
48: {
    22: {
        "name": "David Bowie",
        "socketID": "erv7e6v876vr"
    },
    23: {
        "name": "Barack H. Obama",
        "socketID": "brt877brtt87"
    }
  }
}

感谢 Node.js,我可以轻松访问像这样的数据(我知道站点和 userId 值)var socket = data[site]["05"].socketId。我猜这要归功于 Node.js,但我不完全确定。

【问题讨论】:

  • jQuery 是处理数据结构的错误工具
  • 我只使用过 JQuery 来处理 AJAX 请求,但是我看到了一些与 JSON 一起工作的函数,这就是我提到它的原因。
  • 如果您使用的是 node.js,则不需要 jQuery 方法 - 所有那些高阶数组函数和 JSON 解析/字符串化都是原生的
  • 我也读过,但我找不到任何关于它如何工作的像样的教程

标签: javascript json node.js express socket.io


【解决方案1】:

您能否对数据进行结构化,使用户 ID 成为键,而不是您必须循环的数组?

var data = {
 45: { user: 'Fred' },
 58: { user: 'Sam' )
};


var userId = 45;
data[userId].user // => 'Fred'

【讨论】:

  • 我稍微修改了{ "45": { // The site "01": { // the userId "name": "John", "socketID": "erv7e6v876vr" }, "02": { "name": "Coleen", "socketID": "brt877brtt87" } }, "46": { "01": { "name": "Carter", "socketID": "erv7e6v876vr" }, "02": { "name": "Johnes", "socketID": "brt877brtt87" } } } 的结构,所以,有了站点和userId,我可以做这样的事情,不是吗? var socket = data[site][userId].socketId;
【解决方案2】:

构建查找表:作为键值映射的 JS 对象,其中键是 id,值是用户对象。然后您可以在O(n) 中选择/匹配用户按id

var map = {};
for (var i=0; i<arr.length; i++) {
    var site = arr[i].site,
        users = arr[i].users;
    for (var j=0; j<users.length; j++) {
        users[i].site = site; // needed for finding a user's site
        map[ users[i].idUser ] = users[i];
    }
}

// Now,
> map[ 23 ] 
{idUser:23, idSocket:"v8d9d0fgfs7d", name:"Barack H. Obama", site:48}

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 2015-07-06
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多