![](/img/trans.png)
[英]Chaining array methods (filter, map, reduce) instead of using double loop
[英]Is there any possible way of sorting that array using .reduce(), .map(), .filter() methods all together?
这次迭代我已经苦苦挣扎了几天。 无论我使用哪种方法,我都只能在没有进一步算法的情况下映射或过滤“汽车”阵列。 我想创建一个对象数组,品牌名称,其中包括驱动程序名称,从品牌对象创建一个数组。
我尝试在我的代码中以不同的方式和不同的位置混合这些方法,但我唯一实现的是一个没有数组内部品牌的映射数组。 我也浏览了整个堆栈以寻找类似的问题和特殊的解决方案。
var cars = [
{'brand': 'Ford'},
{'brand': 'Seat'},
{'brand': 'Opel'},
{'brand': 'Kia'},
{'brand': 'Mitsubishi'},
{'brand': 'Toyota'}
];
var drivers = [
{'name': 'Mark', 'car': 'Seat'},
{'name': 'John', 'car': 'Ford'},
{'name': 'Michael', 'car': 'Kia'},
{'name': 'Joe', 'car': 'Toyota'}
];
var assosiated = {};
console.log(assosiated);
这就是我尝试做的事情,但它不符合我的期望:
assosiated = cars.map(function (carss) {
var driver = drivers.filter(function (dri) {
return carss.brand === dri.car;
});
return carss.brand;
}).reduce(function (prev, curr) {
return prev + '\n' + curr;
});
我希望输出看起来像这样:
assosiated = {
"Ford": [
{"name": "John"}
],
"Seat": [
{"name": "Mark"}
],
"Opel": [],
"Kia": [
{"name": "Michael"}
],
"Mitsubishi": [],
"Toyota": [
{"name": "Joe"}
]
}
我还想使用上面写的所有方法。 知道我该怎么做才能对它进行排序?
您还处理这么使用数组的方法,如对象文本.map()
.filter()
.reduce()
等只是解决方案的一部分。 详情在演示中评论。
let cars = [ {'brand': 'Ford'}, {'brand': 'Seat'}, {'brand': 'Opel'}, {'brand': 'Kia'}, {'brand': 'Mitsubishi'}, {'brand': 'Toyota'} ]; let drivers = [ {'name': 'Mark', 'car': 'Seat'}, {'name': 'John', 'car': 'Ford'}, {'name': 'Michael', 'car': 'Kia'}, {'name': 'Joe', 'car': 'Toyota'} ]; // Declare empty object let association = {}; /* //A - for...of loop iterates through drivers array Each iteration is obj = {'name':*, 'car':*} //B - Obj association KEY = the value of 'car' obj['car'] VALUE = an array with an object inside key='name', value = value of 'name' */ for (let obj of drivers) {//A association[obj['car']] = [{'name': obj['name']}];//B } /* //A - for...of loop iterates through cars array Each iteration is obj = {'brand': *} //B - if none of the keys of Object association matches the values of cars array then add an empty array named as the current "brand" value */ for (let obj of cars) { //A if (!Object.keys(association).includes(obj['brand'])) {//B association[obj['brand']] = []; } } console.log(association);
您只需要使用reduce
和filter
以下是我的例子
var cars = [ {'brand': 'Ford'}, {'brand': 'Seat'}, {'brand': 'Opel'}, {'brand': 'Kia'}, {'brand': 'Mitsubishi'}, {'brand': 'Toyota'} ]; var drivers = [ {'name': 'Mark', 'car': 'Seat'}, {'name': 'John', 'car': 'Ford'}, {'name': 'Michael', 'car': 'Kia'}, {'name': 'Joe', 'car': 'Toyota'} ]; var items = cars.reduce((result, {brand}) => { result[brand] = drivers .filter(({car}) => car === brand) .map(({name}) => ({name})); return result; }, {}) console.log(items);
在你的.map()
函数中,你只是回归汽车的品牌。 因此,从它返回的数组将如下所示:
[
'Ford',
'Seat',
'Opel',
...
]
这是传递给.reduce()
函数的内容。
如果您想要一个具有您指定格式的数组,请将您的函数更改为以下内容,它应该可以正常工作:
assosiated = cars.map(function (carss) {
var driver = drivers.filter(function (dri) {
return carss.brand === dri.car;
});
// return carss.brand; YOU'RE ONLY RETURNING THE BRAND
return {carss.brand: driver}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.