Объединение двух объектов в массив при сохранении ключевых значений - PullRequest
0 голосов
/ 24 февраля 2019

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

Мой код создает новые автомобили.Я хочу организовать свои новые автомобили в массив позже, имея возможность упорядочить их по модели, году выпуска, цвету и т. Д. Часть этой организационной логики еще не реализована, так как я сосредоточен на том, чтобы устранить слияние объектовпрежде чем данные станут слишком длинными.

class Car {
    constructor(type, model_year) {
        this.type = type,
        this.model_year = model_year

    }
}

class Tesla extends Car{
    constructor(type, model_year){

        super(type, model_year)
    }
}

let myTesla1 = new Tesla("Sedan", 2015)
let myTesla2 = new Tesla("Coupe", 2014)

Мой желаемый результат будет:

let teslas = // Here is what I'm failing to implement
console.log(teslas)
// ["type", "Sedan", "model_year", "2015", "type", "Coupe", "model_year", "2014"]

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

Моя попытка

Я попытался нанести на карту объект, используя следующие записи:

let teslas = Object.entries(myTesla1).map(([key, value]) => ({key, value}));
console.log(teslas);

Но мой вывод был не совсем тем, что я искал, так как он представлял значения ключа следующим образом:

[ { key: 'type', value: 'Sedan' },
  { key: 'model_year', value: 2015 } ]

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

Ответы [ 5 ]

0 голосов
/ 24 февраля 2019

Вы можете использовать concat.apply() и Object.entries() примерно так:

class Car {
    constructor(type, model_year) {
        this.type = type,
        this.model_year = model_year

    }
}

class Tesla extends Car{
    constructor(type, model_year){

        super(type, model_year)
    }
}

let myTesla1 = new Tesla("Sedan", 2015)
let myTesla2 = new Tesla("Coupe", 2014)

let teslas = [].concat.apply([], Object.entries(myTesla1).concat(Object.entries(myTesla2)));
0 голосов
/ 24 февраля 2019

Я собираюсь поработать с вашим комментарием: Я уверен, что есть лучший способ организовать эти автомобили, но я также не могу понять это

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

class Car {
  constructor(type, model_year) {
    this.type = type,
    this.model_year = model_year
  }
}

class Tesla extends Car {
  constructor(type, model_year) {
    super(type, model_year)
  }
}

let myTesla1 = new Tesla("Sedan", 2015)
let myTesla2 = new Tesla("Coupe", 2014)

const teslas = [myTesla1, myTesla2]

const carListWithKeyValues = teslas.map(tesla => Object.assign(tesla))

console.log(carListWithKeyValues)

/*
output:

[
  {
    "type": "Sedan",
    "model_year": 2015
  },
  {
    "type": "Coupe",
    "model_year": 2014
  }
]

*/
0 голосов
/ 24 февраля 2019

Вы можете использовать Array.reduce() и Object.entries(), чтобы сделать это.Для каждой записи каждого автомобиля вы нажимаете имя свойства, а затем вы вводите значение свойства в выходной массив:

class Car {
  constructor(type, model_year) {
    this.type = type,
    this.model_year = model_year
  }
}

class Tesla extends Car{
  constructor(type, model_year){
    super(type, model_year)
  }
}

const tesla1 = new Tesla("Sedan", 2015);
const tesla2 = new Tesla("Coupe", 2014);

const teslas = [tesla1, tesla2].reduce((acc, car) => {
  Object.entries(car).forEach(([key, val]) => acc.push(key, val));
  return acc;
}, []);

console.log(teslas);
0 голосов
/ 24 февраля 2019

Вы можете сделать это так же просто

<script type="text/javascript">
    class Car {
    constructor(type, model_year) {
        this.type = type,
        this.model_year = model_year

    }
}

class Tesla extends Car{
    constructor(type, model_year){

        super(type, model_year)
    }
}

let myTesla1 = new Tesla("Sedan", 2015)
let myTesla2 = new Tesla("Coupe", 2014)

var objects = [myTesla1, myTesla2];

var results = [];

objects.forEach(function(o){

    for(var key in o){
        results.push(key);
        results.push(o[key]);
    }
});

console.log("myTesla1", myTesla1);
console.log("myTesla2", myTesla2);

console.log("results", results);
</script>
0 голосов
/ 24 февраля 2019

Используйте вместо этого функцию reduce.

class Car {
  constructor(type, model_year) {
    this.type = type,
      this.model_year = model_year
  }
}

class Tesla extends Car {
  constructor(type, model_year) {
    super(type, model_year)
  }
}

let myTesla1 = new Tesla("Sedan", 2015);
let myTesla2 = new Tesla("Coupe", 2014);

let teslas = [];

// Concatenate the entries [key, value] to the accumulator
[myTesla1, myTesla2].forEach((obj) => teslas = teslas.concat(Object.entries(obj)
              .reduce((a, entries) => a.concat(entries), [])));

console.log(teslas);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...