JavaScript - как получить значение, используя идентификатор JSON, который находится в другом JSON - PullRequest
0 голосов
/ 02 июля 2018

Упражнение выглядит следующим образом:

Требуется получить Соглашение с именами клиентов, упорядоченных от наивысшего к наименьшему по ОБЩЕЙ сумме остатков.

с этими объектами 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)  
 };

получение следующего:

enter image description here

но я не могу найти способ получить соответствующее имя клиента, которое находится в другом json, и присоединить его к окончательному запросу, который пока показывает только id с итогом, поскольку они находятся в одном и том же 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}

Ответы [ 4 ]

0 голосов
/ 02 июля 2018

Я бы выбрал другой подход, начав с клиентов и создав объект-клиент, который представляет ваш конечный результат. Тогда достаточно просто вызвать forEach на счетах и ​​добавить остаток к клиентскому объекту.

Например:

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))
0 голосов
/ 02 июля 2018

Когда вы вызываете Object.keys для объекта map, вы получаете массив идентификаторов, потому что именно так вы его строите (объект map) с помощью Array#reduce. Поэтому, когда вы вызываете Array#map для этого массива идентификаторов, значение, которое передается обратному вызову, является идентификатором, а не именем. Немного измените код 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 в объект, где ключи - это идентификаторы, а значения - это имена, чтобы не было необходимости использовать 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. Я не испорчу это тебе.

0 голосов
/ 02 июля 2018

Я хотел бы отобразить желаемый результат следующим образом:

function sortClientsTotalBalances(clients, accounts) {
    // Every client are mapped to wanted data result.
    let results = clients.map((client) => {
      // Here I get client total balance by using reduce
      let clientBalance = accounts.reduce((acc, account) => {
        if (account.clientId === client.id ) {
          acc += account.balance;
        }
        return acc; 
      }, 0);
    // Here I create wanted result object;
    let result = {
      id: client.id,
      name: client.name,
      totalBalance: clientBalance 
    };
    return result;
  });

  // Return sorted results
  return results.sort((a, b) => a.totalBalance < b.totalBalance );
}
0 голосов
/ 02 июля 2018

Вставьте этот кусок в конец вашей функции?

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...