繁体   English   中英

是否有任何可能的方法使用.reduce(),。map(),。filter()方法一起排序该数组?

[英]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); 

您只需要使用reducefilter

以下是我的例子

 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.

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