关于javascript:在保持关键值的同时将两个对象合并到数组中

Merging Two Objects Into Array While Keeping Key Values

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

我的代码是制造新车。稍后,我想将我的新车组织成一个数组,能够按车型、车型年份、颜色等组织它们。有些组织逻辑还没有实现,因为我的重点是在数据变得太长之前完成对象合并。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)

我期望的输出是:

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

也许我的逻辑错了。我相信有更好的方法来组织这些车,但我也没能搞清楚。

我的尝试

我试图用这样的条目映射对象:

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

但我的输出并不完全是我想要的,因为它将关键值设置为这样:

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

事先谢谢你的帮助。我对这个还不太熟悉,所以请原谅任何应该做得更好的事情。


使用函数reduce代替。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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);
1
.as-console-wrapper { max-height: 100% !important; top: 0; }


我将和你的评论一起工作:我确信有更好的方法来组织这些车,但我也没能弄清楚。

我建议您使用一个数组,每辆车一个条目,这个条目是一个键-值对的简单映射。您可以使用Object.assign来完成从类实例到普通对象的映射:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
  }
]

*/


您可以使用Array.reduce()Object.entries()来执行此操作。对于每辆车的每个条目,您可以推送属性的名称,然后在输出数组中推送属性的值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);


您可以这样使用concat.apply()Object.entries()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)));


你也可以用这种简单的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<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);