【问题标题】:I want to show top 5 from an array of object我想显示对象数组中的前 5 个
【发布时间】:2021-09-06 15:54:00
【问题描述】:

console.log截图:

我想从下面不起作用的对象数组中选择前五个对象。要选择 5 个元素,我已应用 slice() 但它不起作用。当我控制结果时,它会向我显示它拥有的所有元素。请帮我这样做。下面是我的代码

 async function getCoins() {
    let url = 'https://bitbns.com/order/getTopTickerVolume/';
    try {
      let res = await fetch(url);
      return await res.json();
    } catch (error) {
      console.log(error);
    }
  }

  async function renderCurrency() {
    let currencies = await getCoins();
    //console.log(currencies,'JSHR')
    let html = '';
    var coinlist = [];
    
    coinlist.push(currencies);
    console.log(coinlist);
    const fiveValues = coinlist.slice(0, 5);

    console.log(fiveValues,"five")
    
    for (const [key, value] of Object.entries(coinlist)) {      
      for (const [key1, value1] of Object.entries(value)) {
        //console.log(value1,"hello")
        

        var diff = value1.last_traded_price-value1.highest_buy_bid;
        var change = diff.toFixed(2);
        let htmlSegment = `<tr>
                              <td><img src="bitcoin.png">${key1}/INR</td>
                              <td>${value1.highest_buy_bid}</td>
                              <td>${change}</td>
                          </tr>`;
      html += htmlSegment;

      }
    }


    let banner = document.querySelector('#tablebody');
    banner.innerHTML = html;

  }

  renderCurrency();
</script>

这是我得到的控制台日志结果

[
    {
        "BTC": {
            "highest_buy_bid": 2627674.07,
            "lowest_sell_bid": 2635150,
            "last_traded_price": 2619002.02,
            "volume": {
                "max": "2662220.89",
                "min": "2275000.00",
                "volume": 126.32525071
            }
        },
        "ETH": {
            "highest_buy_bid": 155291.33,
            "lowest_sell_bid": 155800,
            "last_traded_price": 155789.27,
            "volume": {
                "max": "157995.43",
                "min": "134430.00",
                "volume": 1477.4024985
            }
        },
        "XRP": {
            "highest_buy_bid": 46.8,
            "lowest_sell_bid": 47,
            "last_traded_price": 47,
            "volume": {
                "max": "49.37",
                "min": "40.16",
                "volume": 1974895.82
            }
        },
        "BNS": {
            "highest_buy_bid": 5.38,
            "lowest_sell_bid": 5.43,
            "last_traded_price": 5.37,
            "volume": {
                "max": "5.49",
                "min": "5.22",
                "volume": 933417.9355
            }
        },
        "DOGE": {
            "highest_buy_bid": 16.183,
            "lowest_sell_bid": 16.265,
            "last_traded_price": 16.265,
            "volume": {
                "max": "17.259",
                "min": "12.967",
                "volume": 8058176
            }
        },
        "ADA": {
            "highest_buy_bid": 96.68,
            "lowest_sell_bid": 96.69,
            "last_traded_price": 96.68,
            "volume": {
                "max": "97.99",
                "min": "79.00",
                "volume": 3043873.8
            }
        },
        "DOT": {
            "highest_buy_bid": 1240,
            "lowest_sell_bid": 1247.02,
            "last_traded_price": 1247.41,
            "volume": {
                "max": "1288.28",
                "min": "1027.33",
                "volume": 39325.4208
            }
        },
        "AAVE": {
            "highest_buy_bid": 17245.38,
            "lowest_sell_bid": 17389.92,
            "last_traded_price": 17201.18,
            "volume": {
                "max": "17469.80",
                "min": "13496.90",
                "volume": 979.43
            }
        },
        "BNB": {
            "highest_buy_bid": 22100.31,
            "lowest_sell_bid": 22256.47,
            "last_traded_price": 22336.93,
            "volume": {
                "max": "22705.08",
                "min": "18051.97",
                "volume": 6377.23
            }
        },
        "SOL": {
            "highest_buy_bid": 2299.08,
            "lowest_sell_bid": 2319,
            "last_traded_price": 2294.67,
            "volume": {
                "max": "2421.79",
                "min": "1610.00",
                "volume": 21862.1351
            }
        },
        "MATIC": {
            "highest_buy_bid": 91.596,
            "lowest_sell_bid": 91.6,
            "last_traded_price": 91.6,
            "volume": {
                "max": "95.550",
                "min": "73.380",
                "volume": 714962
            }
        },
        "UNI": {
            "highest_buy_bid": 1372.81,
            "lowest_sell_bid": 1386.59,
            "last_traded_price": 1396.46,
            "volume": {
                "max": "1414.69",
                "min": "1093.00",
                "volume": 1235.39
            }
        },
        "CRV": {
            "highest_buy_bid": 117.15,
            "lowest_sell_bid": 118.52,
            "last_traded_price": 116.61,
            "volume": {
                "max": "120.50",
                "min": "96.35",
                "volume": 367729.311
            }
        },
        "YFI": {
            "highest_buy_bid": 2429207.42,
            "lowest_sell_bid": 2453040.98,
            "last_traded_price": 2428926.85,
            "volume": {
                "max": "2491352.60",
                "min": "1971910.23",
                "volume": 7.209645
            }
        },
        "CAKE": {
            "highest_buy_bid": 1016.69,
            "lowest_sell_bid": 1026.83,
            "last_traded_price": 1016.69,
            "volume": {
                "max": "1047.52",
                "min": "757.68",
                "volume": 25417.21
            }
        }
    }
]

【问题讨论】:

  • coinlistcoinlist.push(currencies) 之后只有一个元素。你希望如何从中分割出 5 个元素?
  • 你有一个包含一个对象的数组。你想得到什么结果?
  • 您返回的对象是一个数组,但它只有一个元素。注意 [{ anyObject}]。
  • 对象有 15 个属性。你想获得其中的 5 个属性吗?
  • 先把它转换成数组就可以了。

标签: javascript arrays api object fetch


【解决方案1】:

currencies 对象转换为带有Object.entries() 的数组。然后您可以对其进行排序并切分其中的前五个。

async function renderCurrency() {
  let currencies = await getCoins();
  //console.log(currencies,'JSHR')
  let html = '';
  var coinlist = Object.entries(currencies).sort((c1, c2) => c1[1].highest_buy_bid - c2[1].highest_buy_bid).slice(0, 5);

  console.log(coinlist);

  for (const [key, value] of coinlist) {
    var diff = value.last_traded_price - value.highest_buy_bid;
    var change = diff.toFixed(2);
    let htmlSegment = `<tr>
                          <td><img src="bitcoin.png">${key1}/INR</td>
                          <td>${value.highest_buy_bid}</td>
                          <td>${change}</td>
                       </tr>`;
    html += htmlSegment;
  }

  let banner = document.querySelector('#tablebody');
  banner.innerHTML = html;
}

【讨论】:

  • 感谢@barmar 的回复。但我在这里想要的是排序最高的 5 名。你能告诉我吗?
【解决方案2】:

您可以对Object.entries 进行排序并使用slice 获得前5 名。然后使用Object.fromEntries 从这些条目中创建一个新对象。

const data = [{
  "BTC": {
    "highest_buy_bid": 2627674.07,
    "lowest_sell_bid": 2635150,
    "last_traded_price": 2619002.02,
    "volume": {
      "max": "2662220.89",
      "min": "2275000.00",
      "volume": 126.32525071
    }
  },
  "ETH": {
    "highest_buy_bid": 155291.33,
    "lowest_sell_bid": 155800,
    "last_traded_price": 155789.27,
    "volume": {
      "max": "157995.43",
      "min": "134430.00",
      "volume": 1477.4024985
    }
  },
  "XRP": {
    "highest_buy_bid": 46.8,
    "lowest_sell_bid": 47,
    "last_traded_price": 47,
    "volume": {
      "max": "49.37",
      "min": "40.16",
      "volume": 1974895.82
    }
  },
  "BNS": {
    "highest_buy_bid": 5.38,
    "lowest_sell_bid": 5.43,
    "last_traded_price": 5.37,
    "volume": {
      "max": "5.49",
      "min": "5.22",
      "volume": 933417.9355
    }
  },
  "DOGE": {
    "highest_buy_bid": 16.183,
    "lowest_sell_bid": 16.265,
    "last_traded_price": 16.265,
    "volume": {
      "max": "17.259",
      "min": "12.967",
      "volume": 8058176
    }
  },
  "ADA": {
    "highest_buy_bid": 96.68,
    "lowest_sell_bid": 96.69,
    "last_traded_price": 96.68,
    "volume": {
      "max": "97.99",
      "min": "79.00",
      "volume": 3043873.8
    }
  },
  "DOT": {
    "highest_buy_bid": 1240,
    "lowest_sell_bid": 1247.02,
    "last_traded_price": 1247.41,
    "volume": {
      "max": "1288.28",
      "min": "1027.33",
      "volume": 39325.4208
    }
  },
  "AAVE": {
    "highest_buy_bid": 17245.38,
    "lowest_sell_bid": 17389.92,
    "last_traded_price": 17201.18,
    "volume": {
      "max": "17469.80",
      "min": "13496.90",
      "volume": 979.43
    }
  },
  "BNB": {
    "highest_buy_bid": 22100.31,
    "lowest_sell_bid": 22256.47,
    "last_traded_price": 22336.93,
    "volume": {
      "max": "22705.08",
      "min": "18051.97",
      "volume": 6377.23
    }
  },
  "SOL": {
    "highest_buy_bid": 2299.08,
    "lowest_sell_bid": 2319,
    "last_traded_price": 2294.67,
    "volume": {
      "max": "2421.79",
      "min": "1610.00",
      "volume": 21862.1351
    }
  },
  "MATIC": {
    "highest_buy_bid": 91.596,
    "lowest_sell_bid": 91.6,
    "last_traded_price": 91.6,
    "volume": {
      "max": "95.550",
      "min": "73.380",
      "volume": 714962
    }
  },
  "UNI": {
    "highest_buy_bid": 1372.81,
    "lowest_sell_bid": 1386.59,
    "last_traded_price": 1396.46,
    "volume": {
      "max": "1414.69",
      "min": "1093.00",
      "volume": 1235.39
    }
  },
  "CRV": {
    "highest_buy_bid": 117.15,
    "lowest_sell_bid": 118.52,
    "last_traded_price": 116.61,
    "volume": {
      "max": "120.50",
      "min": "96.35",
      "volume": 367729.311
    }
  },
  "YFI": {
    "highest_buy_bid": 2429207.42,
    "lowest_sell_bid": 2453040.98,
    "last_traded_price": 2428926.85,
    "volume": {
      "max": "2491352.60",
      "min": "1971910.23",
      "volume": 7.209645
    }
  },
  "CAKE": {
    "highest_buy_bid": 1016.69,
    "lowest_sell_bid": 1026.83,
    "last_traded_price": 1016.69,
    "volume": {
      "max": "1047.52",
      "min": "757.68",
      "volume": 25417.21
    }
  }
}]

// sort entries by highest buy order
const sortedEntries = Object.entries(data[0]).sort(([, va], [, vb]) => {
  return vb.highest_buy_bid - va.highest_buy_bid;
});

// create new object from first 5 sorted entries
const result = Object.fromEntries(sortedEntries.slice(0, 5));

console.log(result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2016-02-08
    • 2018-12-05
    • 2021-12-01
    相关资源
    最近更新 更多