在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个项目做一次。