如何将两个对象组合成一个数组,同时又将键值保留在对象中?我已经找到了合并对象的解决方案,但是它们似乎都不保留键值。
我的代码正在制造新车。我希望稍后将新车组织成一个阵列,能够按型号,型号年份,颜色等进行组织。由于我正在集中精力解决对象合并问题,因此尚未实现某些组织逻辑。在数据变得太长之前。
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 } ]
在此先感谢您的帮助。我对此还很陌生,所以请原谅应该采取更好的措施。
答案 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)));