Я работаю над запросом GET, который находит идентификатор и количество владений, которые пользователь сохранил в базе данных. Он берет этот идентификатор и вызывает функцию, которая получает обновленную информацию об элементе. То, что я пытаюсь сделать, также включить холдинги в запрос GET, однако я хочу, чтобы он находился внутри объекта с обновленной информацией. По сути, я хочу сгладить эти объекты так, чтобы получился массив из двух объектов, а не объект внутри объекта. Ниже приведен код, который я использую, и результат, который я получаю. Я пробовал изменить часть Object.assign, но по большей части я не понимаю, как этого добиться.

Текущее:

const getFullCryptoPortfolio = () =>
  CryptoPortfolio.find()
    .then(portfolios =>
      Promise.all(portfolios.map(portfolio => getCoins(portfolio.id).then(item =>
        Object.assign({}, item, {
          holdings: portfolio.holdings
        })))));

[
    {
        "0": {
            "id": "bitcoin",
            "name": "Bitcoin",
            "symbol": "BTC",
            "rank": "1",
            "price_usd": "9289.45",
            "price_btc": "1.0",
            "24h_volume_usd": "6536340000.0",
            "market_cap_usd": "157138942782",
            "available_supply": "16915850.0",
            "total_supply": "16915850.0",
            "max_supply": "21000000.0",
            "percent_change_1h": "0.36",
            "percent_change_24h": "-3.7",
            "percent_change_7d": "-18.82",
            "last_updated": "1520905166"
        },
        "holdings": 1
    },
    {
        "0": {
            "id": "ethereum",
            "name": "Ethereum",
            "symbol": "ETH",
            "rank": "2",
            "price_usd": "704.491",
            "price_btc": "0.0765146",
            "24h_volume_usd": "1773830000.0",
            "market_cap_usd": "69147117523.0",
            "available_supply": "98151882.0",
            "total_supply": "98151882.0",
            "max_supply": null,
            "percent_change_1h": "0.53",
            "percent_change_24h": "-3.12",
            "percent_change_7d": "-17.17",
            "last_updated": "1520905152"
        },
        "holdings": 2
    }
]

Пример ожидаемого результата:

 [
    {
            "id": "bitcoin",
            "name": "Bitcoin",
            "symbol": "BTC",
            "rank": "1",
            "price_usd": "9289.45",
            "price_btc": "1.0",
            "24h_volume_usd": "6536340000.0",
            "market_cap_usd": "157138942782",
            "available_supply": "16915850.0",
            "total_supply": "16915850.0",
            "max_supply": "21000000.0",
            "percent_change_1h": "0.36",
            "percent_change_24h": "-3.7",
            "percent_change_7d": "-18.82",
            "last_updated": "1520905166",
            "holdings": 1
    },
    {
            "id": "ethereum",
            "name": "Ethereum",
            "symbol": "ETH",
            "rank": "2",
            "price_usd": "704.491",
            "price_btc": "0.0765146",
            "24h_volume_usd": "1773830000.0",
            "market_cap_usd": "69147117523.0",
            "available_supply": "98151882.0",
            "total_supply": "98151882.0",
            "max_supply": null,
            "percent_change_1h": "0.53",
            "percent_change_24h": "-3.12",
            "percent_change_7d": "-17.17",
            "last_updated": "1520905152",
            "holdings": 2
    }
]
0
jpatel701 13 Мар 2018 в 04:58

2 ответа

Лучший ответ

Похоже, проблема заключается в том, что метод getCoins разрешает массив объектов, которые вы пытаетесь объединить с холдингами. Вы можете изменить свой Object.assign следующим образом:

Object.assign({}, ...item, {
  holdings: portfolio.holdings
});

Это распределит объекты внутри массива элементов. Обратите внимание, что если несколько элементов имеют одно и то же свойство, оно будет отменено более поздним.

Если getCoins всегда возвращает один элемент, вы можете вместо этого сделать -

Object.assign({}, item[0], {
  holdings: portfolio.holdings
});

В качестве альтернативы вы можете сохранить массив и вместо этого назначить владение каждому объекту.

item.map(obj => Object.assign({}, obj , {
  holdings: portfolio.holdings
}))
1
shawon191 13 Мар 2018 в 02:24
  1. Назначьте все свойства "0" нашему объекту 'item';
  2. Назначьте свойство "холдинги" нашему объекту 'item';
  3. вернуть изделие.

    function flatten(input) {
      return input.map(function(x){
        let item = x["0"];
        item["holdings"] = x["holdings"];
        return item;
      });
    }
    
0
Ryan Yuan 13 Мар 2018 в 03:26