如何在nodejs中比较json元素并过滤json文件?

问题描述 投票:0回答:1

我有一个如下所示的json文件。

[
  {
    "symbol": "USDC",
    "name": "USD Coin",
    "decimals": "6",
    "id": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
    "feeTier": "100",
    "amounts": [2499.769116, 2500.269174]
  },
  {
    "symbol": "WETH",
    "name": "Wrapped Ether",
    "decimals": "18",
    "id": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
    "feeTier": "3000",
    "amounts": [1.0526261272920125, 1.0590149439506866]
  },
  {
    "symbol": "USDC",
    "name": "USD Coin",
    "decimals": "6",
    "id": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
    "feeTier": "500",
    "amounts": [2499.591796, 2502.09356]
  },
  {
    "symbol": "WETH",
    "name": "Wrapped Ether",
    "decimals": "18",
    "id": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
    "feeTier": "500",
    "amounts": [1.0551711392408099, 1.0565026582314214]
  },
  {
    "symbol": "FRAX",
    "name": "Frax",
    "decimals": "18",
    "id": "0x853d955acef822db058eb8505911ed77f175b99e",
    "feeTier": "500",
    "amounts": [2505.1101184400254, 2507.620759133425]
  }
]

我将比较具有相同名称的金额值,并且我想显示第一个元素金额较大的金额。在最终版本中,其他 json 元素将不会显示。实际上最终版本如下;

[
  {
    "symbol": "USDC",
    "name": "USD Coin",
    "decimals": "6",
    "id": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
    "feeTier": "100",
    "amounts": [2499.769116, 2500.269174]
  },
  {
    "symbol": "WETH",
    "name": "Wrapped Ether",
    "decimals": "18",
    "id": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
    "feeTier": "3000",
    "amounts": [1.0526261272920125, 1.0590149439506866]
  },
  {
    "symbol": "FRAX",
    "name": "Frax",
    "decimals": "18",
    "id": "0x853d955acef822db058eb8505911ed77f175b99e",
    "feeTier": "500",
    "amounts": [2505.1101184400254, 2507.620759133425]
  }
]

我怎样才能做到这一点?

javascript node.js json compare
1个回答
0
投票

您可以通过迭代对象数组,按“name”属性对它们进行分组,然后过滤每个组以仅包含“amounts”数组的第一个元素大于第二个元素的对象来实现此目的。

演示

const data = [
  {
    "symbol": "USDC",
    "name": "USD Coin",
    "decimals": "6",
    "id": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
    "feeTier": "100",
    "amounts": [2499.769116, 2500.269174]
  },
  {
    "symbol": "WETH",
    "name": "Wrapped Ether",
    "decimals": "18",
    "id": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
    "feeTier": "3000",
    "amounts": [1.0526261272920125, 1.0590149439506866]
  },
  {
    "symbol": "USDC",
    "name": "USD Coin",
    "decimals": "6",
    "id": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
    "feeTier": "500",
    "amounts": [2499.591796, 2502.09356]
  },
  {
    "symbol": "WETH",
    "name": "Wrapped Ether",
    "decimals": "18",
    "id": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
    "feeTier": "500",
    "amounts": [1.0551711392408099, 1.0565026582314214]
  },
  {
    "symbol": "FRAX",
    "name": "Frax",
    "decimals": "18",
    "id": "0x853d955acef822db058eb8505911ed77f175b99e",
    "feeTier": "500",
    "amounts": [2505.1101184400254, 2507.620759133425]
  }
];

const filteredData = data.reduce((acc, obj) => {
  const existing = acc.find(item => item.name === obj.name);
  if (!existing) {
    acc.push(obj);
  } else {
    const [firstAmount, secondAmount] = obj.amounts;
    const [existingFirstAmount, existingSecondAmount] = existing.amounts;
    if (firstAmount > existingFirstAmount && firstAmount > secondAmount) {
      acc = acc.filter(item => item.name !== obj.name);
      acc.push(obj);
    }
  }
  return acc;
}, []);

console.log(filteredData);

© www.soinside.com 2019 - 2024. All rights reserved.