简体   繁体   English

使用另一个 object 的键从对象数组创建新数组

[英]Create new Array from array of objects with keys of another object

I have one array of objects "cars"我有一组对象“汽车”

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'},
];

and one object which contains the quantity of cars和一个包含汽车数量的 object

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

I need to create new array from cars which will have only one copy of object in it and add the "quantity" property to appropriate object.我需要从只有一个 object 副本的汽车创建新数组,并将“数量”属性添加到适当的 object。 How can I achieve this?我怎样才能做到这一点?

expected output.预计 output。

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

You could count directly by using the array with a hash table.您可以使用带有 hash 表的数组直接计数。

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

Creating a new array with all the items from cars object and the count from obj without any duplication.使用来自cars object 的所有项目和来自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);

In order to come up with the new array, it needs to process by two steps:为了产生新的数组,它需要通过两个步骤进行处理:

  1. Keep the first car with unique brand from cars array从汽车阵列中保留第car具有独特品牌的汽车
  2. Attach quantity to the car from objobj将数量附加到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);

You could use two loops to match up the objects from both of your arrays:您可以使用两个循环来匹配来自您的两个 arrays 的对象:

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

Using ES6 modules使用 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM