在javascript中转换为不同形式时合并数组

在javascript中转换为不同形式时合并数组,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有一个以下格式的数组 cars = [ {id: 1, make: 'audi', year: '2010', someProperty: true}, {id: 2, make: 'bmw', year: '2011', someProperty: false}, {id: 3, make: 'bmw', year: '2011', someProperty: true}, {id: 4, make: 'vw', year: '2010', someProperty: true}, {id:

我有一个以下格式的数组

cars = [
{id: 1, make: 'audi', year: '2010', someProperty: true},
{id: 2, make: 'bmw', year: '2011', someProperty: false},
{id: 3, make: 'bmw', year: '2011', someProperty: true},
{id: 4, make: 'vw', year: '2010', someProperty: true},
{id: 5, make: 'vw', year: '2011', someProperty: true},
{id: 6, make: 'audi', year: '2011', someProperty: true},
{id: 7, make: 'bmw', year: '2010', someProperty: false},
{id: 8, make: 'bmw', year: '2011', someProperty: false},
{id: 9, make: 'bmw', year: '2010', someProperty: true}
]
并将其转换为以下格式

requiredFormat = [
  { 
    somePropertyTrue: [
      {id: 1, make: 'audi', year: '2010', someProperty: true},
      {id: 4, make: 'vw', year: '2010', someProperty: true},
      {id: 9, make: 'bmw', year: '2010', someProperty: true} 
    ],
    somePropertyFalse: [
      {id: 7, make: 'bmw', year: '2010', someProperty: false}
    ],
    year: '2010'
  }, 
  {
    somePropertyTrue: [
      {id: 3, make: 'bmw', year: '2011', someProperty: true},
      {id: 5, make: 'vw', year: '2011', someProperty: true},
      {id: 6, make: 'audi', year: '2011', someProperty: true}
    ],
    somePropertyFalse: [
      {id: 2, make: 'bmw', year: '2011', someProperty: false},
      {id: 8, make: 'bmw', year: '2011', someProperty: false}
    ],
    year: '2011'
  }
]
我使用的变换函数如下所示

function transform(cars) {
    return [...cars.reduce ( (acc, car) => {
        const yearGrp = acc.get(car.year) || { 
            somePropertyTrue: [], 
            somePropertyFalse: [],
            year: car.year
        };
        yearGrp['someProperty' + (car.someProperty ? 'True' : 'False')].push(car);
        return acc.set(car.year, yearGrp);
    }, new Map).values()];
}
我正在使用readline读取第一个数组,并每2000个项暂停一次,我正在尝试扩展上述函数以接受以前转换的数组,以便将所有转换的项合并到一个数组中,我尝试了以下方法,但我知道这不是实现此目的的方法

let transform = function transform(cars) {
    return [...cars.reduce((acc, arr) => {
        if (!first) {
            parsedArray.reduce((a) => {
                const yearGrp = a.get(arr.year) ||
                    acc.get(arr.year) || {
                        somePropertyTrue: [], 
                        somePropertyFalse: [],
                        year: arr.year
                    };
                yearGrp['someProperty' + (car.someProperty ? 'True' : 'False')].push(arr);
                return a.set(arr.year, yearGrp);
            });
        } else {
            const yearGrp = acc.get(arr.year) || {
                somePropertyTrue: [], 
                somePropertyFalse: [],
                year: arr.year
            };
            yearGrp['someProperty' + (car.someProperty ? 'True' : 'False')].push(arr);
            return acc.set(arr.year, yearGrp);
        }
    }, new Map())];
};

这里,parsedArray是我第一次尝试填充的东西,并且每隔一次尝试使用它,“first”是一个标志

Array.prototype.reduce()
解决方案:

var-cars=[
{id:1,make:'audi',year:'2010',someProperty:true},{id:2,make:'bmw',year:'2011',someProperty:false},
{id:3,make:'bmw',year:'2011',someProperty:true},{id:4,make:'vw',year:'2010',someProperty:true},
{id:5,make:'vw',year:'2011',someProperty:true},{id:6,make:'audi',year:'2011',someProperty:true},
{id:7,make:'bmw',年份:'2010',someProperty:false},{id:8,make:'bmw',年份:'2011',someProperty:false},
{id:9,make:'bmw',year:'2010',someProperty:true}
],
requiredFormatData=[];
//按“年份”分组
组=车。减少(函数(r,o){
var k='someProperty'+((o.someProperty)-'True':'False');
如果(注册年份){
(r[o.year][k])和&r[o.year][k]。推(o)| |(r[o.year][k]=[o]);
}否则{
r[o.year]={year:o.year};
注册年份][k]=[o];
所需格式数据推送(r[o.year]);
}
返回r;
}, {});

console.log(所需格式数据)最好保留地图/
acc
,以便进一步插入数据。如果需要转换的数据,可以从中获取快照

您可以在映射上使用闭包并返回函数,如

var-transform=(m=>array=>(array.forEach(a=>m.set(…a)),[…m])(新映射);
log(转换(['a',1],'b',2]]);
log(转换(['c',3],'d',4]])

作为控制台包装{max height:100%!important;top:0;}
最好保留map/
acc
,以便进一步插入数据。如果需要转换的数据,可以从中获取快照。从汽车到犯罪的完美变形;-)忘记更新,将编辑:)thankshow我是否拍摄acc的快照,即使我拍摄了快照,那么我如何在第二次重复使用相同的快照?这里的问题是,如果requiredFormatData已经有一个2010年,并且在第二次调用组时,它将不会检查该快照,并在requiredFormatData中添加重复的2010年,我正在尝试合并这个together@Sriram,我没有看到一个测试用例,我的方法会像你说的那样添加一个重复的2010。您的新问题不清楚,解决方案提供了预期的输出这不是我所说的新问题,如果您将上述数组拆分为两个,然后执行两次groups函数,您可以看到。。这就是我在问题中提到的。我希望每2000个项目做一次。