练习如下:
要求按照余额总和从最高到最低顺序获得客户名称的安排。
使用这些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 }
]到目前为止,我得到了每个客户的工资总和。通过这种方式:
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中。
期望的结果
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}发布于 2018-07-02 06:50:37
我将采取一种不同的方法,从客户端开始,并创建一个表示最终输出的客户端对象。然后简单地调用accounts上的forEach并将余额添加到client对象。
例如:
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))
发布于 2018-07-02 06:36:46
要在函数的末尾弹出此块吗?
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;
}发布于 2018-07-02 06:37:11
当您在object map上调用Object.keys时,您会得到一个it数组,因为这是使用Array#reduce构造它( object map)的方式。因此,当您对ID数组调用Array#map时,传递给回调的值是ID而不是名称。稍微修改Array#map代码,以便从clients数组中获取名称,如下所示:
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
};
});示例:
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
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
};
});示例:
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对结果数组进行排序。我不会毁了你的。
https://stackoverflow.com/questions/51127404
复制相似问题