Nano Hash - криптовалюты, майнинг, программирование

Сгруппируйте данные, переименуйте свойство объекта и создайте новый набор данных в NodeJs.

Я новичок в Stackoverflow, а также новичок в JS. Я потерялся в том, как манипулировать данными, и мне нужна помощь. У меня есть набор данных, в котором есть несколько дублирующихся quoteDate. Мне нужно создать новый набор данных, добавив цены под его дату с опцией в качестве имени свойства.

Пожалуйста, смотрите ниже исходные данные:

const dataSet = [
      {"quoteDate":20190925,"price":39926,"option":0},
      {"quoteDate":20191118,"price":43239,"option":0},
      {"quoteDate":20190925,"price":77946,"option":1},
      {"quoteDate":20191125,"price":43178,"option":0},
      {"quoteDate":20191202,"price":46992,"option":0},
      {"quoteDate":20191210,"price":84596,"option":1},
      {"quoteDate":20191202,"price":32256,"option":1},
      {"quoteDate":20191223,"price":32285,"option":0},
      {"quoteDate":20200429,"price":68173,"option":1},
]

Вот конечный результат желания:

const newDataSet = [
      {"Date": "20190925","A": 39926,"B": 77946,},
      {"Date": "20191118","A": 43239,},
      {"Date": "20191125","A": 43178,},
      {"Date": "20191202","A": 46992,"B": 32256,},
      {"Date": "20191210","B": 84596,},
      {"Date": "20191223","A": 32285,},
      {"Date": "20200429","B": 68173,},
    ]

Я пробовал код ниже, но безуспешно :(

let newDataSet = Object.values(dataSet.reduce((a, {price, quoteDate, option})=>{
  if(!a[quoteDate] && a[option] === 0)  
    a[quoteDate] = Object.assign({},{'A': price, Date: quoteDate });  
  else if(!a[quoteDate] && a[option] === 1)  
    a[quoteDate] = Object.assign({},{'B': price, Date: quoteDate }); 
  return a;
 },{}));
 console.log(newDataSet);

Было бы здорово, если бы кто-нибудь мог помочь мне в этом!

Спасибо!


  • имеет ли значение порядок окончательного набора данных? 30.05.2020
  • Да, порядок не имеет значения 31.05.2020

Ответы:


1

Используйте разброс объектов, чтобы добавить новый [quoteDate] в аккумулятор и включить предыдущее значение [quoteDate]. Используйте вычисляемые имена свойств, чтобы установить A или B в качестве имени свойства в соответствии с option:

const dataSet = [{"quoteDate":20190925,"price":39926,"option":0},{"quoteDate":20191118,"price":43239,"option":0},{"quoteDate":20190925,"price":77946,"option":1},{"quoteDate":20191125,"price":43178,"option":0},{"quoteDate":20191202,"price":46992,"option":0},{"quoteDate":20191210,"price":84596,"option":1},{"quoteDate":20191202,"price":32256,"option":1},{"quoteDate":20191223,"price":32285,"option":0},{"quoteDate":20200429,"price":68173,"option":1}];

const newDataSet = Object.values(dataSet.reduce((a, {price, quoteDate, option}) => ({
  ...a, // spread the current accumulator
  [quoteDate]: { // add a property according to quoteDate
    ...a[quoteDate], // spread the current quoteDate - undefined or null values will be ignored
    Date: quoteDate, // create the date property
    [option ? 'B' : 'A']: price // create A or B property
  }
}),{}));

console.log(newDataSet);

Другой вариант - мутировать аккумулятор. Это особенно важно, если у вас много предметов, и важна производительность.

const dataSet = [{"quoteDate":20190925,"price":39926,"option":0},{"quoteDate":20191118,"price":43239,"option":0},{"quoteDate":20190925,"price":77946,"option":1},{"quoteDate":20191125,"price":43178,"option":0},{"quoteDate":20191202,"price":46992,"option":0},{"quoteDate":20191210,"price":84596,"option":1},{"quoteDate":20191202,"price":32256,"option":1},{"quoteDate":20191223,"price":32285,"option":0},{"quoteDate":20200429,"price":68173,"option":1}];

const newDataSet = Object.values(dataSet.reduce((a, {price, quoteDate, option})=>{
  a[quoteDate] = a[quoteDate] || { Date: quoteDate };
  
  a[quoteDate][option ? 'B' : 'A'] = price;
    
  return a;
},{}));

console.log(newDataSet);

30.05.2020
  • Привет, Ори, большое спасибо за помощь, я ясно понимаю свою ошибку. Это поможет мне на потом точно! 31.05.2020

  • 2

    Я хотел бы предложить функциональный подход с использованием Map и созданной мной библиотеки. Вам может показаться, что это легче поддерживать. Вы должны использовать Карты поверх объектов для тяжелых вставок, так как они были созданы для этой цели. подробнее о Картах

    const { pipe, fork, map, switchCase, reduce, get, eq } = rubico
    
    const dataSet = [
      {"quoteDate":20190925,"price":39926,"option":0},
      {"quoteDate":20191118,"price":43239,"option":0},
      {"quoteDate":20190925,"price":77946,"option":1},
      {"quoteDate":20191125,"price":43178,"option":0},
      {"quoteDate":20191202,"price":46992,"option":0},
      {"quoteDate":20191210,"price":84596,"option":1},
      {"quoteDate":20191202,"price":32256,"option":1},
      {"quoteDate":20191223,"price":32285,"option":0},
      {"quoteDate":20200429,"price":68173,"option":1},
    ]
    
    const toString = x => `${x}`
    
    const addQuotes = (q1, q2) => {
      const hasA = q1.A || q2.A
      const hasB = q1.B || q2.B
      return {
        Date: q1.Date,
        ...hasA && { A: (q1.A || 0) + (q2.A || 0) },
        ...hasB && { B: (q1.B || 0) + (q2.B || 0) },
      }
    }
    
    const incrementMap = (y, xi) => {
      if (y.has(xi.Date)) {
        y.set(xi.Date, addQuotes(y.get(xi.Date), xi))
      } else {
        y.set(xi.Date, xi)
      }
      return y
    }
    
    const xf = pipe([
      map(switchCase([
        eq(get('option'), 0),
        fork({
          Date: pipe([get('quoteDate'), toString]),
          A: get('price'),
        }),
        fork({
          Date: pipe([get('quoteDate'), toString]),
          B: get('price'),
        }),
      ])),
      reduce(incrementMap, new Map()),
      x => [...x.values()],
    ])
    
    console.log(xf(dataSet))
    <script src="https://unpkg.com/rubico/index.js" crossorigin></script>

    30.05.2020
  • Привет Ричи, большое спасибо за ваше предложение! Это совсем другой подход, я тоже его оставлю :) 31.05.2020
  • Очень признателен! 31.05.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..