У меня есть следующие данные API:

{
    "status": "1",
    "message": "OK",
    "result": [
        {
            "blockNumber": "14376792",
            "timeStamp": "1642218997",
            "hash": "0xe7a8a5793d1e85ec6f6de891f8be9bee2bf455b086236a98365be00febb8dec9",
            "nonce": "852",
            "blockHash": "0x45b51bbac31bd1aef3215db88d05faa1172f9b9b7cb1f8f570b67e0bcef4e954",
            "from": "0x6d038b92c6aa2fc4db2ca80dc9dc5d63ddafe33d",
            "contractAddress": "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
            "to": "0x931b22a138893258c58f3e4143b17086a97862f6",
            "value": "72405000000000000000",
            "tokenName": "Andromeda V2",
            "tokenSymbol": "M31",
            "tokenDecimal": "18",
            "transactionIndex": "25",
            "gas": "266039",
            "gasPrice": "6000000000",
            "gasUsed": "201266",
            "cumulativeGasUsed": "2552933",
            "input": "deprecated",
            "confirmations": "670"
        },
        {
            "blockNumber": "14376072",
            "timeStamp": "1642216837",
            "hash": "0x3ffe38506478a3a81ac39933d46521aa0624cd8b89bc36f79f20c2d0b81c5f92",
            "nonce": "9",
            "blockHash": "0x672eeba6792d41c298057fefd3a31b1ab8acf8b877d8ef3f4c790234f3b4dd1b",
            "from": "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
            "contractAddress": "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
            "to": "0x931b22a138893258c58f3e4143b17086a97862f6",
            "value": "1917760707567583701190",
            "tokenName": "Andromeda V2",
            "tokenSymbol": "M31",
            "tokenDecimal": "18",
            "transactionIndex": "102",
            "gas": "433404",
            "gasPrice": "5000000000",
            "gasUsed": "350916",
            "cumulativeGasUsed": "17811460",
            "input": "deprecated",
            "confirmations": "1390"
        },
        {
            "blockNumber": "14375679",
            "timeStamp": "1642215658",
            "hash": "0x433638955630652e6263f14dd3322668eafe447de5ad26664a307d8283c593da",
            "nonce": "5",
            "blockHash": "0x5ab95c904b703b5b197758772bcadefa7464f2ba4528c2e9615961199ac41517",
            "from": "0x931b22a138893258c58f3e4143b17086a97862f6",
            "contractAddress": "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
            "to": "0x7345c01c595d69a02c95d65551499c67ae3edf4f",
            "value": "620431183157188467115",
            "tokenName": "Andromeda V2",
            "tokenSymbol": "M31",
            "tokenDecimal": "18",
            "transactionIndex": "171",
            "gas": "215186",
            "gasPrice": "5000000000",
            "gasUsed": "169374",
            "cumulativeGasUsed": "34069029",
            "input": "deprecated",
            "confirmations": "1783"
        },
        {
            "blockNumber": "14375679",
            "timeStamp": "1642215658",
            "hash": "0x433638955630652e6263f14dd3322668eafe447de5ad26664a307d8283c593da",
            "nonce": "5",
            "blockHash": "0x5ab95c904b703b5b197758772bcadefa7464f2ba4528c2e9615961199ac41517",
            "from": "0x931b22a138893258c58f3e4143b17086a97862f6",
            "contractAddress": "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
            "to": "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
            "value": "68936798128576496346",
            "tokenName": "Andromeda V2",
            "tokenSymbol": "M31",
            "tokenDecimal": "18",
            "transactionIndex": "171",
            "gas": "215186",
            "gasPrice": "5000000000",
            "gasUsed": "169374",
            "cumulativeGasUsed": "34069029",
            "input": "deprecated",
            "confirmations": "1783"
        },
        {
            "blockNumber": "14375177",
            "timeStamp": "1642214152",
            "hash": "0x3d499ef6fe397cf121608aaff9a1c02e863fdacd41afea946f548f1f38c630df",
            "nonce": "563",
            "blockHash": "0xdceb19ad995f0cd0aae6e911744be3c6d3bf81b9e707e710bf0f06f6c1379030",
            "from": "0x931b22a138893258c58f3e4143b17086a97862f6",
            "contractAddress": "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
            "to": "0x6d4d24e50c1bad7df10fafb979de12b6cc6cdac8",
            "value": "1023172053263716043052",
            "tokenName": "Andromeda V2",
            "tokenSymbol": "M31",
            "tokenDecimal": "18",
            "transactionIndex": "93",
            "gas": "215186",
            "gasPrice": "5000000000",
            "gasUsed": "169374",
            "cumulativeGasUsed": "12183067",
            "input": "deprecated",
            "confirmations": "2285"
        }
    ]
}

Две строки этих данных имеют одинаковый идентификатор hash 0x433638955630652e6263f14dd3322668eafe447de5ad26664a307d8283c593da (вы можете выполнить поиск самостоятельно). Я хочу объединить некоторые переменные в этих двух строках, чтобы они стали одним.

Here is the logic:

Если хэш строк одинаковый, объединить (сумма) value данные.

Мой текущий код выглядит так:

if(myData[id].length > 0) {
    for (let i in myData[id]) {
        const number = myData[id][i].value;
        // other values.....
        console.log('values is: ', number);
        // doing something with result
    }
}

Пример кода выше возвращаемого значения каждой строки в API, но, как я уже упоминал, мне нужно суммировать value строк с одинаковым хешем.

Crystal clear

На основе приведенного выше примера API у меня есть 5 строк, мне нужно получить 4 строк. Один из них, данные которого суммируются из 2-х строк с одинаковыми hash.

Обновить

expected result (с комментариями)

{
    "status": "1",
    "message": "OK",
    "result": [
     // other...
     {
            "blockNumber": "14375679",
            "timeStamp": "1642215658",
            "hash": "0x433638955630652e6263f14dd3322668eafe447de5ad26664a307d8283c593da",
            "nonce": "5",
            "blockHash": "0x5ab95c904b703b5b197758772bcadefa7464f2ba4528c2e9615961199ac41517",
            "from": "0x931b22a138893258c58f3e4143b17086a97862f6",
            "contractAddress": "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
            "to": "0x7345c01c595d69a02c95d65551499c67ae3edf4f",
            "value": "xxxxxxxxxxxx",   //<<-------- This value will be sum of the 2 rows value with same hash
            "tokenName": "Andromeda V2",
            "tokenSymbol": "M31",
            "tokenDecimal": "18",
            "transactionIndex": "171",
            "gas": "215186",
            "gasPrice": "5000000000",
            "gasUsed": "169374",
            "cumulativeGasUsed": "34069029",
            "input": "deprecated",
            "confirmations": "1783"
    },
    // other...
};

Есть идеи?

0
mafortis 15 Янв 2022 в 07:44
Поэтому объекты с одинаковым хешем станут одним объектом?
 – 
Muhammad Atif Akram
15 Янв 2022 в 07:50
В яблочко
 – 
mafortis
15 Янв 2022 в 07:55
Должно быть 4 объектов конечного результата, потому что только один идентификатор совпадает с hash...
 – 
decpk
15 Янв 2022 в 07:58
Вы правы должно быть 4.
 – 
mafortis
15 Янв 2022 в 08:04

3 ответа

const data = {
  status: "1",
  message: "OK",
  result: [
    {
      blockNumber: "14376792",
      timeStamp: "1642218997",
      hash:
        "0xe7a8a5793d1e85ec6f6de891f8be9bee2bf455b086236a98365be00febb8dec9",
      nonce: "852",
      blockHash:
        "0x45b51bbac31bd1aef3215db88d05faa1172f9b9b7cb1f8f570b67e0bcef4e954",
      from: "0x6d038b92c6aa2fc4db2ca80dc9dc5d63ddafe33d",
      contractAddress: "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
      to: "0x931b22a138893258c58f3e4143b17086a97862f6",
      value: "72405000000000000000",
      tokenName: "Andromeda V2",
      tokenSymbol: "M31",
      tokenDecimal: "18",
      transactionIndex: "25",
      gas: "266039",
      gasPrice: "6000000000",
      gasUsed: "201266",
      cumulativeGasUsed: "2552933",
      input: "deprecated",
      confirmations: "670"
    },
    {
      blockNumber: "14376072",
      timeStamp: "1642216837",
      hash:
        "0x3ffe38506478a3a81ac39933d46521aa0624cd8b89bc36f79f20c2d0b81c5f92",
      nonce: "9",
      blockHash:
        "0x672eeba6792d41c298057fefd3a31b1ab8acf8b877d8ef3f4c790234f3b4dd1b",
      from: "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
      contractAddress: "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
      to: "0x931b22a138893258c58f3e4143b17086a97862f6",
      value: "1917760707567583701190",
      tokenName: "Andromeda V2",
      tokenSymbol: "M31",
      tokenDecimal: "18",
      transactionIndex: "102",
      gas: "433404",
      gasPrice: "5000000000",
      gasUsed: "350916",
      cumulativeGasUsed: "17811460",
      input: "deprecated",
      confirmations: "1390"
    },
    {
      blockNumber: "14375679",
      timeStamp: "1642215658",
      hash:
        "0x433638955630652e6263f14dd3322668eafe447de5ad26664a307d8283c593da",
      nonce: "5",
      blockHash:
        "0x5ab95c904b703b5b197758772bcadefa7464f2ba4528c2e9615961199ac41517",
      from: "0x931b22a138893258c58f3e4143b17086a97862f6",
      contractAddress: "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
      to: "0x7345c01c595d69a02c95d65551499c67ae3edf4f",
      value: "620431183157188467115",
      tokenName: "Andromeda V2",
      tokenSymbol: "M31",
      tokenDecimal: "18",
      transactionIndex: "171",
      gas: "215186",
      gasPrice: "5000000000",
      gasUsed: "169374",
      cumulativeGasUsed: "34069029",
      input: "deprecated",
      confirmations: "1783"
    },
    {
      blockNumber: "14375679",
      timeStamp: "1642215658",
      hash:
        "0x433638955630652e6263f14dd3322668eafe447de5ad26664a307d8283c593da",
      nonce: "5",
      blockHash:
        "0x5ab95c904b703b5b197758772bcadefa7464f2ba4528c2e9615961199ac41517",
      from: "0x931b22a138893258c58f3e4143b17086a97862f6",
      contractAddress: "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
      to: "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
      value: "68936798128576496346",
      tokenName: "Andromeda V2",
      tokenSymbol: "M31",
      tokenDecimal: "18",
      transactionIndex: "171",
      gas: "215186",
      gasPrice: "5000000000",
      gasUsed: "169374",
      cumulativeGasUsed: "34069029",
      input: "deprecated",
      confirmations: "1783"
    },
    {
      blockNumber: "14375177",
      timeStamp: "1642214152",
      hash:
        "0x3d499ef6fe397cf121608aaff9a1c02e863fdacd41afea946f548f1f38c630df",
      nonce: "563",
      blockHash:
        "0xdceb19ad995f0cd0aae6e911744be3c6d3bf81b9e707e710bf0f06f6c1379030",
      from: "0x931b22a138893258c58f3e4143b17086a97862f6",
      contractAddress: "0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414",
      to: "0x6d4d24e50c1bad7df10fafb979de12b6cc6cdac8",
      value: "1023172053263716043052",
      tokenName: "Andromeda V2",
      tokenSymbol: "M31",
      tokenDecimal: "18",
      transactionIndex: "93",
      gas: "215186",
      gasPrice: "5000000000",
      gasUsed: "169374",
      cumulativeGasUsed: "12183067",
      input: "deprecated",
      confirmations: "2285"
    }
  ]
};

//hashes
const hashes = [];
data.result = [
  ...data.result.filter((item) => {
    if (!hashes.includes(item.hash)) {
      hashes.push(item.hash);
      return item;
    }
  })
];
console.log(data.result);

@mafortis Пожалуйста, попробуйте это. Надеюсь, это сработает.

Измените массив результатов и добавьте объект, у которого нет повторяющегося хэш-идентификатора.

0
Muhammad Atif Akram 15 Янв 2022 в 08:17
Тестирую, о результате сообщу
 – 
mafortis
15 Янв 2022 в 08:25
Да, пожалуйста
 – 
Muhammad Atif Akram
15 Янв 2022 в 08:29
Что-то здесь не так, не знаю, что? видите, я получаю 5 результатов API и создаю пустой массив hashes, но в моем массиве хэшей я получаю 4, что правильно. Но как мне заставить мой цикл работать на основе этих хэшей и вернуть мои данные? как вы видите, мои данные - это результаты (я обновлю свой код для вас)
 – 
mafortis
15 Янв 2022 в 08:35
Хорошо, я только что понял!!! этот код обновляет мои результаты myData[id]? так что мне не нужно вносить какие-либо изменения в мою часть цикла? (как он суммирует мои значения?)
 – 
mafortis
15 Янв 2022 в 08:37
Извините, я не понял. Вы также хотите суммировать стоимость дублированных объектов. ? например, два объекта имеют одинаковый хэш, тогда они станут 1 объектом, но их «значение» будет равно сумме значений обоих объектов?
 – 
Muhammad Atif Akram
15 Янв 2022 в 09:45

Короткий и понятный код с использованием lodash:

data.result = _(data.result)
.groupBy("hash")
.mapValues(arr => ({ ...arr[0], value: _.sumBy(arr, "value") }))
.values()
.valueOf();

Другие предлагаемые здесь коды не суммируют value элементов массива. Они просто группируют/фильтруют массив.

0
mafortis 15 Янв 2022 в 12:05
Я думаю, что в вашем коде на один ) меньше. Должен ли я поставить его после values() или после valueOf()?
 – 
mafortis
15 Янв 2022 в 11:35
Хорошо, я нашел ошибку в вашем коде: у меня есть 2 значения из одного и того же хэша, например: 604800000000000000000 и 67200000000000000000, но в результатах я получаю это 60480000000000000000067200000000000000000, что означает, что они не суммировались но соберите их вместе, вместо этого он должен сделать это 604800000000000000000 + 67200000000000000000 = xxxxxxxxx(whatever the result is...)
 – 
mafortis
15 Янв 2022 в 12:04

Решаемая

Я прокомментировал каждую часть для лучшего понимания.

Финальный код

data.result = _(data.result)
.groupBy('hash').map(function(v, k) {
    //mapping values of each row to arrays ['1000', '2000']
    var myValue =  _.map(v, 'value');

    // if array includes more than one number (means there was same hash) then convert them to number array instead of string array (future calculation purpose)
    if(myValue.length > 1){
      var convertToNumberArray = Array.from(myValue,Number); // [1000, 2000]
    } else {
      var convertToNumberArray = myValue;
    }
    // return merged data and summed values
    return {
        ...v[0],
        value: ''+_.sum(convertToNumberArray)+''
    } 
}).value();

Вот как это выглядит после приведенного выше кода:

Output:

[
  {
    blockNumber: '14376792',
    timeStamp: '1642218997',
    hash: '0xe7a8a5793d1e85ec6f6de891f8be9bee2bf455b086236a98365be00febb8dec9',
    nonce: '852',
    blockHash: '0x45b51bbac31bd1aef3215db88d05faa1172f9b9b7cb1f8f570b67e0bcef4e954',
    from: '0x6d038b92c6aa2fc4db2ca80dc9dc5d63ddafe33d',
    contractAddress: '0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414',
    to: '0x931b22a138893258c58f3e4143b17086a97862f6',
    value: '72405000000000000000',
    tokenName: 'Andromeda V2',
    tokenSymbol: 'M31',
    tokenDecimal: '18',
    transactionIndex: '25',
    gas: '266039',
    gasPrice: '6000000000',
    gasUsed: '201266',
    cumulativeGasUsed: '2552933',
    input: 'deprecated',
    confirmations: '670'
  },
  {
    blockNumber: '14376072',
    timeStamp: '1642216837',
    hash: '0x3ffe38506478a3a81ac39933d46521aa0624cd8b89bc36f79f20c2d0b81c5f92',
    nonce: '9',
    blockHash: '0x672eeba6792d41c298057fefd3a31b1ab8acf8b877d8ef3f4c790234f3b4dd1b',
    from: '0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414',
    contractAddress: '0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414',
    to: '0x931b22a138893258c58f3e4143b17086a97862f6',
    value: '1917760707567583701190',
    tokenName: 'Andromeda V2',
    tokenSymbol: 'M31',
    tokenDecimal: '18',
    transactionIndex: '102',
    gas: '433404',
    gasPrice: '5000000000',
    gasUsed: '350916',
    cumulativeGasUsed: '17811460',
    input: 'deprecated',
    confirmations: '1390'
  },
  {
    blockNumber: '14375679',
    timeStamp: '1642215658',
    hash: '0x433638955630652e6263f14dd3322668eafe447de5ad26664a307d8283c593da',
    nonce: '5',
    blockHash: '0x5ab95c904b703b5b197758772bcadefa7464f2ba4528c2e9615961199ac41517',
    from: '0x931b22a138893258c58f3e4143b17086a97862f6',
    contractAddress: '0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414',
    to: '0x7345c01c595d69a02c95d65551499c67ae3edf4f',
    value: '689367981285765000000', // <-- value was summed up
    tokenName: 'Andromeda V2',
    tokenSymbol: 'M31',
    tokenDecimal: '18',
    transactionIndex: '171',
    gas: '215186',
    gasPrice: '5000000000',
    gasUsed: '169374',
    cumulativeGasUsed: '34069029',
    input: 'deprecated',
    confirmations: '1783'
  },
  {
    blockNumber: '14375177',
    timeStamp: '1642214152',
    hash: '0x3d499ef6fe397cf121608aaff9a1c02e863fdacd41afea946f548f1f38c630df',
    nonce: '563',
    blockHash: '0xdceb19ad995f0cd0aae6e911744be3c6d3bf81b9e707e710bf0f06f6c1379030',
    from: '0x931b22a138893258c58f3e4143b17086a97862f6',
    contractAddress: '0xb46acb1f8d0ff6369c2f00146897aea1dfcf2414',
    to: '0x6d4d24e50c1bad7df10fafb979de12b6cc6cdac8',
    value: '1023172053263716043052',
    tokenName: 'Andromeda V2',
    tokenSymbol: 'M31',
    tokenDecimal: '18',
    transactionIndex: '93',
    gas: '215186',
    gasPrice: '5000000000',
    gasUsed: '169374',
    cumulativeGasUsed: '12183067',
    input: 'deprecated',
    confirmations: '2285'
  }
]
0
mafortis 15 Янв 2022 в 13:21