Объединить объект с Vuejs и Axios - PullRequest
1 голос
/ 05 марта 2019

У меня есть два объекта, полученных из axios.get и выборка из RSS-канала, и результат выглядит примерно так: Два объекта

У объектов есть поля с разными именами, но сТакое же значение.Например: Title и Full_name ссылаются на имя объекта.

В настоящее время у меня есть эта конфигурация:

Obj1 = {title: "Main text 1", body: "text text 1"},
       {title: "Main text 2", body: "text text 2"};
Obj2 = {full_name: "Main Text 3", description: "text text 3"};

Я хотел бы получить объект, подобный этому:

Obj3= {name: "Main text 1", desc: "text text 1"},
      {name: "Main text 2", desc: "text text 2"};
      {name: "Main Text 3", desc: "text text 3"};

В настоящее время я использую этот код:

<script>
    export default {
        data() {
            return {
                obj1: {},
                obj2: {} 
            }
        },
        mounted() {
            this.axios
                .get('https://url.com')
                .then((response) => {
                    this.obj1 = response.data;
                  });
            fetch('https://url2.com')
                .then((res) => res.json())
                .then((response) => {
                    this.obj2 = response.items; 
                });
        } 
    }
</script>

Я пробовал эти решения, результат всегда пуст:

let merged = {...this.obj1, ...this.obj2};

var merged = Object.assign( {}, this.obj1, this.obj2);

Ответы [ 4 ]

0 голосов
/ 05 марта 2019

Проблема в том, что ваш код var merged = Object.assign( {}, this.obj1, this.obj2); выполняется перед обновлением obj1 or obj2 по ответу API.

Вы можете смотреть obj1 & obj2. Обновите объект merged при изменении любого из obj1 или obj2.

<template>
  <div>Merged Object: {{ merged }}</div>
</template>

<script>
export default {
  data() {
    return {
      obj1: {},
      obj2: {},
        merged: {}
      }
    },
  mounted() {
    this.axios
      .get('https://url.com')
      .then((response) => {
        this.obj1 = response.data;
      });
      fetch('https://url2.com')
        .then((res) => res.json())
        .then((response) => {
          this.obj2 = response.items; 
        });
  },
  watch: { 
    // whenever obj1 changes, this function will run
    obj1(newVal, oldVal) {
      this.merged = Object.assign( {}, newVal, this.obj2);
    },

    // whenever obj2 changes, this function will run
    obj2(newVal, oldVal) {
      this.merged = Object.assign( {}, newVal, this.obj1);
    }

  }
}
</script>
0 голосов
/ 05 марта 2019

Вы должны map второй ответ, а затем concat на первый.

var concObject = obj1.concat( obj2.map( item => ({name: item.full_name, desc: item.description}) ) )

Примечание: из вашего примера obj1 и obj2 являются массивами.

0 голосов
/ 05 марта 2019

Согласно вашему скриншоту, this.obj1 и this.obj2 равны Arrays

Таким образом, вы можете объединить их с помощью оператора распространения, используя скобки для создания нового массива:

let merged = [...this.obj1, ...this.obj2]
0 голосов
/ 05 марта 2019

Создать новое имя массива как

var newArray[]
var Obj1 = {title: "Main text 1", body: "text text 1"},
           {title: "Main text 2", body: "text text 2"};
var Obj2 = {full_name: "Main Text 3", description: "text text 3"};`enter newArray.Push(Obj1);
newArray.Push(Obj2);
...