首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript -如何通过使用另一个JSON中的JSON ID来获取值

JavaScript -如何通过使用另一个JSON中的JSON ID来获取值
EN

Stack Overflow用户
提问于 2018-07-02 06:21:36
回答 4查看 729关注 0票数 1

练习如下:

要求按照余额总和从最高到最低顺序获得客户名称的安排。

使用这些javascript对象:

代码语言:javascript
复制
const clients = [
{ id: 1, taxNumber: '86620855', name: 'HECTOR ACUÑA BOLAÑOS'},
{ id: 2, taxNumber: '7317855K', name: 'JESUS RODRIGUEZ ALVAREZ'},
{ id: 3, taxNumber: '73826497', name: 'ANDRES NADAL MOLINA'},
{ id: 4, taxNumber: '88587715', name: 'SALVADOR ARNEDO MANRIQUEZ'},
{ id: 5, taxNumber: '94020190', name: 'VICTOR MANUEL ROJAS LUCAS'},
{ id: 6, taxNumber: '99804238', name: 'MOHAMED FERRE SAMPER' }
];

和:

代码语言:javascript
复制
const accounts = [
{ clientId: 6, bankId: 1, balance: 15000 },
{ clientId: 1, bankId: 3, balance: 18000 },
{ clientId: 5, bankId: 3, balance: 135000 },
{ clientId: 2, bankId: 2, balance: 5600 },
{ clientId: 3, bankId: 1, balance: 23000 },
{ clientId: 5, bankId: 2, balance: 15000 },
{ clientId: 3, bankId: 3, balance: 45900 },
{ clientId: 2, bankId: 3, balance: 19000 },
{ clientId: 4, bankId: 3, balance: 51000 },
{ clientId: 5, bankId: 1, balance: 89000 },
{ clientId: 1, bankId: 2, balance: 1600 },
{ clientId: 5, bankId: 3, balance: 37500 },
{ clientId: 6, bankId: 1, balance: 19200 },
{ clientId: 2, bankId: 3, balance: 10000 },
{ clientId: 3, bankId: 2, balance: 5400 },
{ clientId: 3, bankId: 1, balance: 9000 },
{ clientId: 4, bankId: 3, balance: 13500 },
{ clientId: 2, bankId: 1, balance: 38200 },
{ clientId: 5, bankId: 2, balance: 17000 },
{ clientId: 1, bankId: 3, balance: 1000 },
{ clientId: 5, bankId: 2, balance: 600 },
{ clientId: 6, bankId: 1, balance: 16200 },
{ clientId: 2, bankId: 2, balance: 10000 }
]

到目前为止,我得到了每个客户的工资总和。通过这种方式:

代码语言:javascript
复制
function sortClientsTotalBalances() {

var map = accounts.reduce(function(map, account) {

    var clientId = account.clientId
    var balance = +account.balance
    map[clientId] = (map[clientId] || 0) + balance

    return map
  }, {})

  console.log(map)

var obj = clients;

    var array = Object.keys(map).map(function(name) {


    return {
      fullName: name,
      totalbalance: map[name]
    }
  })
    console.log(array)  
 };

获取以下内容:

但是我找不到方法来获得另一个json中的客户端的相应名称,并将其连接到最终的查询中,到目前为止,该查询只显示id和total,因为它们在相同的json中。

期望的结果

代码语言:javascript
复制
  0: { name: 'HECTOR ACUÑA BOLAÑOS', totalbalance: 8340 },
  1: { name: 'JESUS RODRIGUEZ ALVAREZ', totalbalance: 5000},
  2: { name: 'ANDRES NADAL MOLINA', totalbalance: 7500 },
  3: { name: 'SALVADOR ARNEDO MANRIQUEZ', totalbalance: 6500},
  4: { name: 'VICTOR MANUEL ROJAS LUCAS', totalbalance: 9300},
  5: { name: 'MOHAMED FERRE SAMPER' , totalbalance: 8500}
EN

回答 4

Stack Overflow用户

发布于 2018-07-02 06:50:37

我将采取一种不同的方法,从客户端开始,并创建一个表示最终输出的客户端对象。然后简单地调用accounts上的forEach并将余额添加到client对象。

例如:

代码语言:javascript
复制
const clients = [{ id: 1, taxNumber: '86620855', name: 'HECTOR ACUÑA BOLAÑOS'},{ id: 2, taxNumber: '7317855K', name: 'JESUS RODRIGUEZ ALVAREZ'},{ id: 3, taxNumber: '73826497', name: 'ANDRES NADAL MOLINA'},{ id: 4, taxNumber: '88587715', name: 'SALVADOR ARNEDO MANRIQUEZ'},{ id: 5, taxNumber: '94020190', name: 'VICTOR MANUEL ROJAS LUCAS'},{ id: 6, taxNumber: '99804238', name: 'MOHAMED FERRE SAMPER' }];
const accounts = [{ clientId: 6, bankId: 1, balance: 15000 },{ clientId: 1, bankId: 3, balance: 18000 },{ clientId: 5, bankId: 3, balance: 135000 },{ clientId: 2, bankId: 2, balance: 5600 },{ clientId: 3, bankId: 1, balance: 23000 },{ clientId: 5, bankId: 2, balance: 15000 },{ clientId: 3, bankId: 3, balance: 45900 },{ clientId: 2, bankId: 3, balance: 19000 },{ clientId: 4, bankId: 3, balance: 51000 },{ clientId: 5, bankId: 1, balance: 89000 },{ clientId: 1, bankId: 2, balance: 1600 },{ clientId: 5, bankId: 3, balance: 37500 },{ clientId: 6, bankId: 1, balance: 19200 },{ clientId: 2, bankId: 3, balance: 10000 },{ clientId: 3, bankId: 2, balance: 5400 },{ clientId: 3, bankId: 1, balance: 9000 },{ clientId: 4, bankId: 3, balance: 13500 },{ clientId: 2, bankId: 1, balance: 38200 },{ clientId: 5, bankId: 2, balance: 17000 },{ clientId: 1, bankId: 3, balance: 1000 },{ clientId: 5, bankId: 2, balance: 600 },{ clientId: 6, bankId: 1, balance: 16200 },{ clientId: 2, bankId: 2, balance: 10000 }]
     
// make client object that looks like final result
const client_obj = clients.reduce((a,c) => {
    a[c.id] = {name: c.name, totalbalance: 0}
    return a
}, {})

// just add balances to appropriate value of that object
accounts.forEach(item => client_obj[item.clientId].totalbalance += item.balance)

// sort object objvalues 
console.log(Object.values(client_obj).sort((a,b) => a.totalbalance - b.totalbalance))

票数 1
EN

Stack Overflow用户

发布于 2018-07-02 06:36:46

要在函数的末尾弹出此块吗?

代码语言:javascript
复制
for (var i=0;i<array.length();i++){
    //find the corresponding name of the client
    for (var j=0;j<clients.length();j++){
       if (array[i].fullName==clients[j].id){
           array[i].name=clients[j].name;
       }
    }
    //Rearrange fullName and ID
    array[i].id=parseInt(array[i].fullName);
    delete array[i].fullName;
}
票数 0
EN

Stack Overflow用户

发布于 2018-07-02 06:37:11

当您在object map上调用Object.keys时,您会得到一个it数组,因为这是使用Array#reduce构造它( object map)的方式。因此,当您对ID数组调用Array#map时,传递给回调的值是ID而不是名称。稍微修改Array#map代码,以便从clients数组中获取名称,如下所示:

代码语言:javascript
复制
var array = Object.keys(map).map(function(id) {
    var client = clients.find(function(client) {           // find the client from the array clients
        return client.id == id;                            // ... whose id is the same as the current id
    });

    return {
        fullName: client.name,                             // use that client name
        totalbalance: map[id]                              // access the balance using id
    };
});

示例:

代码语言:javascript
复制
const clients = [ { id: 1, taxNumber: '86620855', name: 'HECTOR ACUÑA BOLAÑOS'}, { id: 2, taxNumber: '7317855K', name: 'JESUS RODRIGUEZ ALVAREZ'}, { id: 3, taxNumber: '73826497', name: 'ANDRES NADAL MOLINA'}, { id: 4, taxNumber: '88587715', name: 'SALVADOR ARNEDO MANRIQUEZ'}, { id: 5, taxNumber: '94020190', name: 'VICTOR MANUEL ROJAS LUCAS'}, { id: 6, taxNumber: '99804238', name: 'MOHAMED FERRE SAMPER' } ];

const accounts = [ { clientId: 6, bankId: 1, balance: 15000 }, { clientId: 1, bankId: 3, balance: 18000 }, { clientId: 5, bankId: 3, balance: 135000 }, { clientId: 2, bankId: 2, balance: 5600 }, { clientId: 3, bankId: 1, balance: 23000 }, { clientId: 5, bankId: 2, balance: 15000 }, { clientId: 3, bankId: 3, balance: 45900 }, { clientId: 2, bankId: 3, balance: 19000 }, { clientId: 4, bankId: 3, balance: 51000 }, { clientId: 5, bankId: 1, balance: 89000 }, { clientId: 1, bankId: 2, balance: 1600 }, { clientId: 5, bankId: 3, balance: 37500 }, { clientId: 6, bankId: 1, balance: 19200 }, { clientId: 2, bankId: 3, balance: 10000 }, { clientId: 3, bankId: 2, balance: 5400 }, { clientId: 3, bankId: 1, balance: 9000 }, { clientId: 4, bankId: 3, balance: 13500 }, { clientId: 2, bankId: 1, balance: 38200 }, { clientId: 5, bankId: 2, balance: 17000 }, { clientId: 1, bankId: 3, balance: 1000 }, { clientId: 5, bankId: 2, balance: 600 }, { clientId: 6, bankId: 1, balance: 16200 }, { clientId: 2, bankId: 2, balance: 10000 } ];

var map = accounts.reduce(function(map, account) {
    var clientId = account.clientId;
    var balance = +account.balance;
    map[clientId] = (map[clientId] || 0) + balance;

    return map;
}, {});

var array = Object.keys(map).map(function(id) {
    var client = clients.find(function(client) {           // find the client from the array clients
        return client.id == id;                            // ... whose id is the same as the current id
    });

    return {
        fullName: client.name,                             // use that client name
        totalbalance: map[id]                              // access the balance using id
    };
});

console.log(array);

另一种方法是将clients数组转换为一个对象,其中键是ID,值是名称,因此不需要使用Array#find

代码语言:javascript
复制
var clientsById = clients.reduce(function(obj, client) {
    obj[client.id] = client.name;
    return obj;
}, {});

var array = Object.keys(map).map(function(id) {
    return {
        fullName: clientsById[id],                         // use id to get the name from the object clientsById
        totalbalance: map[id]                              // access the balance using id
    };
});

示例:

代码语言:javascript
复制
const clients = [ { id: 1, taxNumber: '86620855', name: 'HECTOR ACUÑA BOLAÑOS'}, { id: 2, taxNumber: '7317855K', name: 'JESUS RODRIGUEZ ALVAREZ'}, { id: 3, taxNumber: '73826497', name: 'ANDRES NADAL MOLINA'}, { id: 4, taxNumber: '88587715', name: 'SALVADOR ARNEDO MANRIQUEZ'}, { id: 5, taxNumber: '94020190', name: 'VICTOR MANUEL ROJAS LUCAS'}, { id: 6, taxNumber: '99804238', name: 'MOHAMED FERRE SAMPER' } ];

const accounts = [ { clientId: 6, bankId: 1, balance: 15000 }, { clientId: 1, bankId: 3, balance: 18000 }, { clientId: 5, bankId: 3, balance: 135000 }, { clientId: 2, bankId: 2, balance: 5600 }, { clientId: 3, bankId: 1, balance: 23000 }, { clientId: 5, bankId: 2, balance: 15000 }, { clientId: 3, bankId: 3, balance: 45900 }, { clientId: 2, bankId: 3, balance: 19000 }, { clientId: 4, bankId: 3, balance: 51000 }, { clientId: 5, bankId: 1, balance: 89000 }, { clientId: 1, bankId: 2, balance: 1600 }, { clientId: 5, bankId: 3, balance: 37500 }, { clientId: 6, bankId: 1, balance: 19200 }, { clientId: 2, bankId: 3, balance: 10000 }, { clientId: 3, bankId: 2, balance: 5400 }, { clientId: 3, bankId: 1, balance: 9000 }, { clientId: 4, bankId: 3, balance: 13500 }, { clientId: 2, bankId: 1, balance: 38200 }, { clientId: 5, bankId: 2, balance: 17000 }, { clientId: 1, bankId: 3, balance: 1000 }, { clientId: 5, bankId: 2, balance: 600 }, { clientId: 6, bankId: 1, balance: 16200 }, { clientId: 2, bankId: 2, balance: 10000 } ];

var map = accounts.reduce(function(map, account) {
    var clientId = account.clientId;
    var balance = +account.balance;
    map[clientId] = (map[clientId] || 0) + balance;

    return map;
}, {});

var clientsById = clients.reduce(function(obj, client) {
    obj[client.id] = client.name;
    return obj;
}, {});

var array = Object.keys(map).map(function(id) {
    return {
        fullName: clientsById[id],                         // use id to get the name from the object clientsById
        totalbalance: map[id]                              // access the balance using id
    };
});

console.log(array);

注意:您仍然需要使用Array#sort对结果数组进行排序。我不会毁了你的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51127404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档