JavaScript中两个或多个数组的SQL连接

JavaScript中两个或多个数组的SQL连接,javascript,sql,arrays,Javascript,Sql,Arrays,我有一个页面的web应用程序,有几个数组,它们是逻辑链接的:来自“用户”的记录指的是“用户类型”中的记录,“费用”指的是“用户”,等等: 我需要以链接的方式显示它们,类似于以下SQL的产品: SELECT charges.date, charges.amount, users.name, user_types.name FROM charges LEFT OUTER JOIN users ON users.id =

我有一个页面的web应用程序,有几个数组,它们是逻辑链接的:来自“用户”的记录指的是“用户类型”中的记录,“费用”指的是“用户”,等等:

我需要以链接的方式显示它们,类似于以下SQL的产品:

SELECT 
     charges.date, 
     charges.amount, 
     users.name, 
     user_types.name
FROM 
     charges
          LEFT OUTER JOIN users ON users.id = charges.user_id
          LEFT OUTER JOIN user_types ON user_types.id = users.user_type_id
我知道我可以在服务器上使用此SQL查询创建API调用,但我希望避免这样做,因为web应用程序中已经加载了表


在内存中连接用户的最简单方法是什么?

制作
用户
地图,这样您就可以使用
用户['u0001']
。然后循环查看
charges
并执行
users[current\u charge.user\u id].charges.push(current\u charge)
users
中的每个用户都应该有一个初始化为空数组的
charges
属性。当您将
users
数组转换为
id=>user
映射时,就可以这样做

在这里您不需要任何特殊的东西,只需通过
用户
费用
进行两次循环即可:

var users_map = {};
var i;
for(i = 0; i < users.length; i++) {
    users_map[users[i].id] = users[i];
    users_map[users[i].id].charges = [];
}

for(i = 0; i < charges.length; i++) {
    users_map[charge[i].user_id].charges.push(charge[i]);
}

您可以使用lodash或其他类似库使上述代码更加美观。

如果您可以修改
用户和
用户类型的填充方式,那么您可以非常快速地完成此操作

您需要将
用户
用户类型
更改为对象,这样您就有了如下功能:

//使用户成为id为键的对象
变量用户={
“u0001”:{name:“John”,user_type_id:“1”},
“u0002”:{name:“Bob”,user_type_id:“1”},
“u0003”:{name:“Alice”,user_type_id:“5”},
“u0004”:{名称:“Jennifer”,用户类型\u id:“5”}
};
//相同的用户类型
变量用户类型={
“1”:{name:“常规客户”},
“5”:{姓名:“VIP客户”}
};
风险值费用=[
{id:“7443”,用户id:“u0001”,日期:“2016-01-01”,金额:“3.99”,
{id:“7445”,用户id:“u0001”,日期:“2016-01-01”,金额:“4.02”,
{id:“7448”,用户id:“u0001”,日期:“2016-01-01”,金额:“6.99”,
{id:“7453”,用户id:“u0003”,日期:“2016-01-01”,金额:“3.00”,
{id:“7469”,用户id:null,日期:“2016-01-01”,金额:“3.99”}
];
//现在,您可以循环使用对象键查找:
var out=[];
对于(var i=0,numCharges=charges.length;i控制台。注销在不重新构造对象的情况下执行此操作的唯一方法是循环和过滤。
您可以通过先处理用户及其类型来稍微优化它,但仅此而已

var用户=[
{id:“u0001”,名称:“John”,用户类型\u id:“1”},
{id:“u0002”,名称:“Bob”,用户类型\u id:“1”},
{id:“u0003”,名称:“Alice”,用户类型\u id:“5”},
{id:“u0004”,名称:“Jennifer”,用户类型\u id:“5”},
//……更多
];
变量用户类型=[
{id:“1”,name:“常规客户”},
{id:“5”,名称:“VIP客户”},
//……更多
];
风险值费用=[
{id:“7443”,用户id:“u0001”,日期:“2016-01-01”,金额:“3.99”,
{id:“7445”,用户id:“u0001”,日期:“2016-01-01”,金额:“4.02”,
{id:“7448”,用户id:“u0001”,日期:“2016-01-01”,金额:“6.99”,
{id:“7453”,用户id:“u0003”,日期:“2016-01-01”,金额:“3.00”,
{id:“7469”,用户id:null,日期:“2016-01-01”,金额:“3.99”,
//……更多
];
//预处理用户
var usersPlusTypes=users.map(函数(u){
var foundUserTypes=user\u types.filter(函数(ut){
返回ut.id==u.user\u type\u id;
});
返回{
id:u.id,
用户:u,
userType:foundUserTypes.length?foundUserTypes[0]:null
}
})
//现在将费用链接到用户
var结果=charges.map(函数(c){
var user=usersPlusTypes.filter(函数(upt){
返回upt.id==c.user\u id;
});
返回{
日期:c.date,
金额:c.金额,
用户名:user.length?用户[0]。用户名:null,
userTypeName:user.length&&user[0]。userType?用户[0]。userType.name:null,
};
});

控制台日志(结果)如果小型库正常,可以通过以下方法完成:

结果将加入以下结构的数组:

[
    [
        {"id":"7443","user_id":"u0001","date":"2016-01-01","amount":"3.99"},
        {"id":"u0001","name":"John","user_type_id":"1"},
        {"id":"1","name":"Regular Clients"}
    ],
    [
        {"id":"7445","user_id":"u0001","date":"2016-01-01","amount":"4.02"},
        {"id":"u0001","name":"John","user_type_id":"1"},
        {"id":"1","name":"Regular Clients"}
    ],
    [
        {"id":"7448","user_id":"u0001","date":"2016-01-01","amount":"6.99"},
        {"id":"u0001","name":"John","user_type_id":"1"},
        {"id":"1","name":"Regular Clients"}
    ],
    [
        {"id":"7453","user_id":"u0003","date":"2016-01-01","amount":"3.00"},
        {"id":"u0003","name":"Alice","user_type_id":"5"},
        {"id":"5","name":"VIP Clients"}
    ],
    [
        {"id":"7469","user_id":null,"date":"2016-01-01","amount":"3.99"},
        null,
        null
    ]
]
该方案的特点是解决方案,扩展了从给定数据生成必要对象的功能

它包括所有
费用的行,因为使用SQL时,也会返回这些行

此处测试
null
值的问题,然后返回
null

var users=[{id:“u0001”,name:“John”,user_type_id:“1”},{id:“u0002”,name:“Bob”,user_type_id:“1”},{id:“u0003”,name:“Alice”,user_type_id:“5”},{id:“u0004”,name:“Jennifer”,user_type_id:“5”},
user_types=[{id:“1”,name:“常规客户端”},{id:“5”,name:“VIP客户端”}],
费用=[{id:“7443”,用户id:“u0001”,日期:“2016-01-01”,金额:“3.99”,日期:{id:“7445”,用户id:“u0001”,日期:“2016-01-01”,金额:“4.02”,日期:},{id:“7448”,用户id:“u0001”,日期:“2016-01-01”,金额:“6.99”,日期:{id:“7453”,用户id:“u0003”,日期:“2016-01-01”,金额:“3.00”,日期:{id:“7469”,用户id:“null,日期:{2016-01”,金额:“3.99”,}],
user=Object.create(null),
type=Object.create(空),
结果;
users.forEach(函数(u){
用户[u.id]=u;
});
用户类型。forEach(函数(t){
类型[t.id]=t;
});
结果=费用。映射(功能(费用){
返回{
“charge.date”:charge.date,
“charge.amount”:charge.amount,
“users.name”:charge.user\u id==null?null:user[charge.user\u id].name,
“用户类型”:charge.user\u id==null?null:type[user[charge.user\u id].u
var joined_data = Object.keys(users_map).map(function (key) {
    return users_map[key];
});
var users = new StrelkiJS.IndexedArray();
users.loadArray([
        { id:   "u0001", name: "John",      user_type_id: "1" },
        { id:   "u0002", name: "Bob",       user_type_id: "1" },
        { id:   "u0003", name: "Alice",     user_type_id: "5" },
        { id:   "u0004", name: "Jennifer",  user_type_id: "5" },
        // ... more
    ]);
var user_types = new StrelkiJS.IndexedArray();
user_types.loadArray([
        { id: "1", name: "Regular Clients"},
        { id: "5", name: "VIP Clients"},
        // ... more
    ]);
var charges = new StrelkiJS.IndexedArray();
charges.loadArray([
        { id: "7443", user_id: "u0001", date: "2016-01-01", amount: "3.99", },
        { id: "7445", user_id: "u0001", date: "2016-01-01", amount: "4.02", },
        { id: "7448", user_id: "u0001", date: "2016-01-01", amount: "6.99", },
        { id: "7453", user_id: "u0003", date: "2016-01-01", amount: "3.00", },
        { id: "7469", user_id: null   , date: "2016-01-01", amount: "3.99", },
        // ... more
    ]);

var result = charges.query([{
    from_col: "user_id",
    to_table: users,
    to_col: "id",
    type: "outer",
    join: [{
        from_col: "user_type_id",
        to_table: user_types,
        to_col: "id",
        type: "outer",
    }]
}])
[
    [
        {"id":"7443","user_id":"u0001","date":"2016-01-01","amount":"3.99"},
        {"id":"u0001","name":"John","user_type_id":"1"},
        {"id":"1","name":"Regular Clients"}
    ],
    [
        {"id":"7445","user_id":"u0001","date":"2016-01-01","amount":"4.02"},
        {"id":"u0001","name":"John","user_type_id":"1"},
        {"id":"1","name":"Regular Clients"}
    ],
    [
        {"id":"7448","user_id":"u0001","date":"2016-01-01","amount":"6.99"},
        {"id":"u0001","name":"John","user_type_id":"1"},
        {"id":"1","name":"Regular Clients"}
    ],
    [
        {"id":"7453","user_id":"u0003","date":"2016-01-01","amount":"3.00"},
        {"id":"u0003","name":"Alice","user_type_id":"5"},
        {"id":"5","name":"VIP Clients"}
    ],
    [
        {"id":"7469","user_id":null,"date":"2016-01-01","amount":"3.99"},
        null,
        null
    ]
]