Манипулировать значениями объектов в массиве и возвращать результат в исходном массиве

#javascript #arrays

#javascript #массивы

Вопрос:

Я пытаюсь выполнить .toLocaleString() для каждого из элементов массива. Я выполняю это, например, для изменения 1111' to 1,111`. Данные, к которым я пытаюсь получить доступ:

 "Data": {
    "id": 1182,
    "time": 1637193600,
    "symbol": "BTC",
    "partner_symbol": "BTC",
    "zero_balance_addresses_all_time": 882855842,
    "unique_addresses_all_time": 920909797,
    "new_addresses": 476543,
    "active_addresses": 992178,
    "average_transaction_value": 18.723511893530098,
    "block_height": 710345,
    "hashrate": 163489266.17996278,
    "difficulty": 22674148233453.105,
    "block_time": 595.6643356643356,
    "block_size": 1267871,
    "current_supply": 18877162,
    "transaction_count": 293867,
    "transaction_count_all_time": 688002252,
    "large_transaction_count": 29400
  }
 

Мой код пытается манипулировать массивом:

 getCryptoBlockchainData(selectedCrypto).then(cryptoTradingSignal => {
      if (cryptoTradingSignal.hasOwnProperty('id')) {
        cryptoTradingSignal.forEach(function (item, i) {
          this[i] = item.toLocaleString();
        }, cryptoTradingSignal);
        return this.setState({cryptoBlockchainData: cryptoTradingSignal});
      } else {
        return this.setState({cryptoBlockchainData: undefined});
      }
    });
  }
 

Комментарии:

1. Array.prototype.map() вернет новый массив с измененными значениями. Вы пробовали это?

Ответ №1:

Вы не можете использовать свойства объекта. Вы можете преобразовать его в массив, сделать свое дело, а затем преобразовать его обратно в объект.

 getCryptoBlockchainData(selectedCrypto).then(cryptoTradingSignal => {
  if (cryptoTradingSignal.hasOwnProperty('id')) {
    const newSignal = Object.fromEntries(
      Object.entries(cryptoTradingSignal).map(([k, v]) => ([k, v.toLocaleString()]))
    );
    return this.setState({cryptoBlockchainData: newSignal});
  } else {
    return this.setState({cryptoBlockchainData: undefined});
  }
}); 

Ответ №2:

вероятно, вы могли бы использовать Array.prototype.map() для этого.

Для вашего кода может быть что-то вроде

 const newArray = Object.keys(object["Data"]).map(item => object[item].toLocaleString()));
 

Смотрите Документы здесь.

Комментарии:

1. кажется, что он никогда не проходит через сопоставление — я устанавливаю точки останова, и он просто перескакивает через него

2. Не могли бы вы предоставить дополнительную информацию и контекст на вашем языке? Возможно, я что-то упускаю из виду.

Ответ №3:

Вы можете перебирать ключи объекта с помощью функции Object.keys() и изменять нужные значения.

  const dataObj = {
    "id": 1182,
    "time": 1637193600,
    "symbol": "BTC",
    "partner_symbol": "BTC",
    "zero_balance_addresses_all_time": 882855842,
    "unique_addresses_all_time": 920909797,
    "new_addresses": 476543,
    "active_addresses": 992178,
    "average_transaction_value": 18.723511893530098,
    "block_height": 710345,
    "hashrate": 163489266.17996278,
    "difficulty": 22674148233453.105,
    "block_time": 595.6643356643356,
    "block_size": 1267871,
    "current_supply": 18877162,
    "transaction_count": 293867,
    "transaction_count_all_time": 688002252,
    "large_transaction_count": 29400
  }
  
  Object.keys(dataObj).forEach(key => dataObj[key] = dataObj[key].toLocaleString());
  
  console.log(dataObj);
   

Редактировать:

Если ваш объект вложен, как в вашем примере, вам также необходимо использовать ключ ‘Data’:

 Object.keys(dataObj['Data']).forEach(key => dataObj['Data'][key] = dataObj['Data'][key].toLocaleString());