【问题标题】:Is there any possible way of sorting that array using .reduce(), .map(), .filter() methods all together?有没有可能使用 .reduce()、.map()、.filter() 方法对该数组进行排序?
【发布时间】:2019-06-19 03:35:07
【问题描述】:

我已经为那次迭代苦苦挣扎了几天。无论我以何种方式使用这些方法,我都只能映射或过滤“汽车”数组,而无需进一步的算法。我想创建一个对象数组,品牌名称,其中包括驱动程序名称,从品牌对象创建一个数组。

我尝试在我的代码中以不同的方式和不同的位置混合这些方法,但我唯一实现的是一个映射数组,其中包含内部没有数组的品牌。我还浏览了整个堆栈以寻找类似的问题和特殊的解决方案。

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

我也想使用上面写的所有方法。知道我该怎么做才能这样排序吗?

【问题讨论】:

  • 请发布您尝试使用但失败的 JavaScript,然后我们会修复它——我们不会为您编写整个代码。看看如何发布minimal reproducible example
  • 哦,对不起,我得用我的代码编辑一下。

标签: javascript functional-programming


【解决方案1】:

您还要处理对象文字,因此使用 .map().filter().reduce() 等数组方法只是解决方案的一部分。详情见demo。

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

【讨论】:

    【解决方案2】:

    你只需要使用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);

    【讨论】:

      【解决方案3】:

      在您的 .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}
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-23
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多