Добавление дополнительных значений к объекту Значения карты (ключ, значение) из наблюдаемого вызова Rx Js - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь добавить данные в вызов API карты. Я использую Rx JS для создания наблюдаемой и хочу добавить эти данные перед подпиской. Несмотря на то, что я могу сделать это после этого, это означает, что мне нужно будет подписаться на данные, что отличается от того, как я делаю это с остальными моими поставщиками услуг.

У меня есть вызов API, site.com/api с типом данных карты. Для краткости я сведу данные к тому, что имеет значение. Он возвращает такой формат, как карта, см. Ниже

interface input {
  name: string;
  month: string;
  season?: string
}

data = {
  '2020-01-01': {
    name: 'test';
    month: 'Jan';
  },
  '2020-01-02': {
    name: 'hi';
    month: 'Feb';
  }
}

Я хочу знать, как сопоставить это, чтобы добавить сезон. Прямо сейчас мой код работает, но вместо добавления сезона к каждому отдельному элементу карты, он полностью создает новый элемент.

const req = this.http.get<any>('site.com/api')
      .pipe(
        map((data) => {
          // Get data keys and associated data key to be all it's current values and add season
          const transformedData = Object.keys(data).map(key => data[key] = {
            ...data,
            season: 'Summer'
          });

          return transformedData;
        }),

      );

Например:

{
0: [
    '2020-01-01': {...},
    '2020-01-02': {...},
    'season': 'Summer'
  ]
1: [
  '2020-01-01': {...},
  '2020-01-02': {...},
  'season': 'Summer'
  ]
}

Что странно, потому что я подумал, что go отображает каждый элемент один раз, так что код через go пройдет, получит ключи первого элемента, а затем изменить его значение.

Некоторые онлайн-ответы используют pluck для изменения значений ключей карты, но это означает, что вы знаете, что это за ключ. Мои ключи карты являются динамическими c, и даты будут меняться, поэтому я не могу использовать этот подход. Другие примеры онлайн - это не карта, а массив.

РЕДАКТИРОВАТЬ

Ожидаемые результаты

{
  '2020-01-01': {
    name: 'test';
    month: 'Jan';
    season: 'Summer';
  },
  '2020-01-02': {
    name: 'hi';
    month: 'Feb';
    season: 'Summer';
  }
}

РЕДАКТИРОВАТЬ Я просто настроил другие свои функции для использования массива объекты вместо карты. Может кто-нибудь закрыть этот вопрос?

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Это один из способов записи, мы можем просто применить это дополнительное свойство к каждому из элементов, используя Object.assign. Ниже приведен рабочий пример!

var data = {
  '2020-01-01': {
    name: 'test',
    month: 'Jan',
  },
  '2020-01-02': {
    name: 'hi',
    month: 'Feb',
  }
}
const req = of(data)
      .pipe(
        map((data) => {
          // Get data keys and associated data key to be all it's current values and add season
          const transformedData = Object.keys(data).map(key => Object.assign(data[key], {season: 'Summer'}));

          return transformedData;
        }),

      ).subscribe((output) => console.log(output));

Пример Stackblitz

0 голосов
/ 25 марта 2020

Вы можете использовать уменьшить

const data = {
  '2020-01-01': {
    name: 'test',
    month: 'Jan',
  },
  '2020-01-02': {
    name: 'hi',
    month: 'Feb',
  }
}
const transformedData = Object.keys(data).reduce((acc, curr) => {
  return {
    ...acc,
    [curr]: {
       ...data[curr],
       season: 'Summer',
    },
  };
}, {});
console.log(transformedData)

или для ... в l oop

const data = {
  '2020-01-01': {
    name: 'test',
    month: 'Jan',
  },
  '2020-01-02': {
    name: 'hi',
    month: 'Feb',
  }
}
let transformedData = {};
for(const item in data){
  transformedData[item] = {
    ...data[item],
    season: 'Summer',
  }
}
console.log(transformedData)
...