【问题标题】:Merging Two Objects Into Array While Keeping Key Values在保留键值的同时将两个对象合并到数组中
【发布时间】:2019-07-18 06:03:24
【问题描述】:

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

我的代码正在创建新车。我想将我的新车组织成一个数组,稍后,能够按型号、型号年份、颜色等来组织它们。其中一些组织逻辑尚未实现,因为我正专注于解决对象合并问题在数据变得太长之前。

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

提前感谢您的帮助。我对此很陌生,所以请原谅任何应该以更好的方式完成的事情。

【问题讨论】:

  • 我确信有更好的方法来组织这些汽车,但我也想不通。看到这个时我确实想知道为什么你会想要以某种方式展平您的对象,使每辆车及其属性之间的关联取决于它们在数组中的顺序。似乎最好有一个带有汽车的数组作为顶级容器,并且该容器具有不同的键值。但这取决于你,真的。

标签: javascript arrays javascript-objects


【解决方案1】:

请改用函数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; }

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

        我将处理您的评论:我确信有更好的方法来组织这些汽车,但我也想不通

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

        【讨论】:

        • 效果很好,非常感谢。如果我想更进一步,sort 这些基于typemodel_year 的特斯拉集合,那么这个输出是否可行,因为它是一组不同的对象?
        • 是的。 Array.sort 接受自定义函数进行排序,如果您按字符串值排序,还有另一个 SO 答案:stackoverflow.com/a/43816588/3084820
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2022-01-19
          • 2014-05-08
          • 2017-07-21
          • 2015-12-27
          • 2014-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-03
          相关资源
          最近更新 更多