【问题标题】:Create new Array from array of objects with keys of another object使用另一个对象的键从对象数组创建新数组
【发布时间】:2020-06-18 14:01:27
【问题描述】:

我有一组对象“汽车”

let cars = [
{id: 1, name: 'Mercedes', year: '2015'},
{id: 2, name: 'Mercedes', year: '2000'},
{id: 3, name: 'BMW', year: '2010'},
{id: 4, name: 'BMW', year: '2004'},
{id: 4, name: 'BMW', year: '2004'},
{id: 4, name: 'BMW', year: '2004'},
{id: 4, name: 'BMW', year: '2004'},
{id: 4, name: 'BMW', year: '2004'},
{id: 5, name: 'Volvo', year: '2012'},
{id: 6, name: 'Volvo', year: '2014'},
{id: 7, name: 'Volvo', year: '2010'},
{id: 8, name: 'Toyota', year: '2012'},
{id: 8, name: 'Jeep', year: '2011'},
];

和一个包含汽车数量的对象

let obj = {
BMW: 6,
Jeep: 1,
Mercedes: 2,
Toyota: 1,
Volvo: 3,
}

我需要从汽车中创建一个新数组,其中只有一个对象副本,并将“数量”属性添加到适当的对象。我怎样才能做到这一点?

预期输出。

newArray = [
    {id: 1, name: 'Mercedes', year: '2015', quantity: 2},
    {id: 3, name: 'BMW', year: '2010', quantity: 6},
    {id: 5, name: 'Volvo', year: '2012', quantity: 3},
    {id: 8, name: 'Toyota', year: '2012', quantity: 1},
    {id: 8, name: 'Jeep', year: '2011', quantity: 1},
]

【问题讨论】:

  • 其中的一个对象副本是什么意思?
  • 您能举一个您期望的输出示例吗?目前,尚不清楚您是否想要按 id 或按名称的唯一对象
  • 我的意思是只有一项同名属性
  • 新对象中的id 和year 怎么样?
  • id 和年份在这种情况下它们并不重要。我用预期的例子编辑了代码

标签: javascript arrays object ecmascript-6


【解决方案1】:

您可以通过使用带有哈希表的数组来直接计数。

let cars = [{ id: 1, name: 'Mercedes', year: '2015' }, { id: 2, name: 'Mercedes', year: '2000' }, { id: 3, name: 'BMW', year: '2010' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 4, name: 'BMW', year: '2004' }, { id: 5, name: 'Volvo', year: '2012' }, { id: 6, name: 'Volvo', year: '2014' }, { id: 7, name: 'Volvo', year: '2010' }, { id: 8, name: 'Toyota', year: '2012' }, { id: 8, name: 'Jeep', year: '2011' }],
    result = Object.values(cars.reduce((r, o) => {
        r[o.name] = r[o.name] || { ... o, quantity: 0 };
        r[o.name].quantity++;
        return r;
    }, []));

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

【讨论】:

    【解决方案2】:

    创建一个新数组,其中包含来自 cars 对象的所有项目和来自 obj 的计数,没有任何重复。

    let cars = [{"id":1,"name":"Mercedes","year":"2015"},{"id":2,"name":"Mercedes","year":"2000"},{"id":3,"name":"BMW","year":"2010"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":4,"name":"BMW","year":"2004"},{"id":5,"name":"Volvo","year":"2012"},{"id":6,"name":"Volvo","year":"2014"},{"id":7,"name":"Volvo","year":"2010"},{"id":8,"name":"Toyota","year":"2012"},{"id":8,"name":"Jeep","year":"2011"}];
    let obj = {BMW: 6,Jeep: 1,Mercedes: 2,Toyota: 1,Volvo: 3}
    let newObj = [];
    let duplicateCheck = []
    cars.forEach(function(item) {
      if (!duplicateCheck.includes(item.name)) {
        duplicateCheck.push(item.name);
        item.quantity = obj[item.name];
        newObj.push(item);
      }
    });
    console.log(newObj);

    【讨论】:

      【解决方案3】:

      为了得到新的数组,需要分两步处理:

      1. 保留第一个 car 与汽车阵列中的独特品牌
      2. 从obj 将数量附加到car

      let cars=[
        {id:1,name:'Mercedes',year:'2015'},
        {id:2,name:'Mercedes',year:'2000'},
        {id:3,name:'BMW',year:'2010'},
        {id:4,name:'BMW',year:'2004'},
        {id:4,name:'BMW',year:'2004'},
        {id:4,name:'BMW',year:'2004'},
        {id:4,name:'BMW',year:'2004'},
        {id:4,name:'BMW',year:'2004'},
        {id:5,name:'Volvo',year:'2012'},
        {id:6,name:'Volvo',year:'2014'},
        {id:7,name:'Volvo',year:'2010'},
        {id:8,name:'Toyota',year:'2012'},
        {id:8,name:'Jeep',year:'2011'}
      ];
      let obj = {
        BMW:6,
        Jeep:1,
        Mercedes:2,
        Toyota:1,
        Volvo:3,
      };
      
      /* The first step:
      you can use .filter to 
      only return the car you are looking for.
      */
      let uniqueCarBrand = [];
      let newArray = cars.filter((car) => {
        /* Check if car name already in the newArray */
        if (uniqueCarBrand.indexOf(car.name) >= 0) return false;
        uniqueCarBrand.push(car.name);
        return true;
      });
      
      /* Second step:
      you will need to attach your quantity to
      the array of cars you just created.
      */
      let result = newArray.map((car) => {
        /* Check if obj has brand name in it, if not, return 0; */
        car.quantity = obj[car.name] || 0;
        return car;
      });
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        您可以使用两个循环来匹配两个数组中的对象:

        let output = [];
        // For each key in your quantity object
        for (let model in obj) {
            // For each car object in your cars array
            for (let car of cars) {
                // This will match the first car in your cars array
                if (car.name === model) {
                    // Add quantity to your car object and add it to your result set
                    car.quantity = obj[model];
                    output.push(car);
                    // This break will continue to the next model car to ensure you only have one result per model
                    break;
                }
            }
        }
        

        【讨论】:

        • 您的代码没有给出想要的结果,output 数组未按id 元素排序
        【解决方案5】:

        使用 ES6 模块

        let cars = [
          {id: 1, name: 'Mercedes', year: '2015'},
          {id: 2, name: 'Mercedes', year: '2000'},
          {id: 3, name: 'BMW', year: '2010'},
          {id: 4, name: 'BMW', year: '2004'},
          {id: 4, name: 'BMW', year: '2004'},
          {id: 4, name: 'BMW', year: '2004'},
          {id: 4, name: 'BMW', year: '2004'},
          {id: 4, name: 'BMW', year: '2004'},
          {id: 5, name: 'Volvo', year: '2012'},
          {id: 6, name: 'Volvo', year: '2014'},
          {id: 7, name: 'Volvo', year: '2010'},
          {id: 8, name: 'Toyota', year: '2012'},
          {id: 8, name: 'Jeep', year: '2011'},
        ];
        let obj = {
          BMW: 6,
          Jeep: 1,
          Mercedes: 2,
          Toyota: 1,
          Volvo: 3,
        }  
        
        let filteredCar = cars.filter((curr, index) => {
          let _cars = JSON.stringify(curr);
          return index === cars.findIndex(obj => {
            return JSON.stringify(obj) === _cars;
          })
        }).map(currCar => {
          currCar.quantity = obj[currCar.name];
                           return currCar});
        
        console.log(filteredCar);

        【讨论】:

          猜你喜欢
          • 2021-03-30
          • 2020-10-02
          • 1970-01-01
          • 2019-02-28
          • 2018-02-13
          • 1970-01-01
          • 2023-01-08
          • 2019-09-09
          • 2015-03-05
          相关资源
          最近更新 更多