在保留键值的同时将两个对象合并到数组中

时间:2019-02-24 20:00:54

标签: javascript arrays javascript-objects

如何将两个对象组合成一个数组,同时又将键值保留在对象中?我已经找到了合并对象的解决方案,但是它们似乎都不保留键值。

我的代码正在制造新车。我希望稍后将新车组织成一个阵列,能够按型号,型号年份,颜色等进行组织。由于我正在集中精力解决对象合并问题,因此尚未实现某些组织逻辑。在数据变得太长之前。

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 :(得分:3)

请改用功能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; }

答案 1 :(得分:1)

您可以使用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);

答案 2 :(得分:1)

我将处理您的评论:我确定有更好的方法来组织这些汽车,但我也无法弄清楚

我将建议您想要的是每辆车一个条目的数组,并且该条目是键值对的简单映射。您可以使用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
  }
]

*/

答案 3 :(得分:0)

您也可以用这种简单的方式完成

<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>

答案 4 :(得分:0)

您可以像这样使用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)));