Есть ли какой-нибудь возможный способ сортировки этого массива, используя методы .reduce (), .map (), .filter () все вместе? - PullRequest
2 голосов
/ 18 июня 2019

Я несколько дней боролся с этой итерацией. Независимо от того, каким образом я использовал эти методы, я мог только отображать или фильтровать массив «автомобилей» без дополнительных алгоритмов. Я хочу создать один массив объектов, имен брендов, который будет включать имена драйверов, создавая массив из объекта бренда.

Я пытался смешивать эти методы по-разному и в разных позициях в моем коде, но единственное, чего я достиг - это сопоставленный массив с брендами без массива внутри. Я также просмотрел весь стек, чтобы найти похожую проблему и исключительное решение.

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

Я также хотел бы использовать все эти методы, написанные выше. Любая идея, что я могу сделать, чтобы сортировать это так?

Ответы [ 3 ]

3 голосов
/ 18 июня 2019

Вы также имеете дело с объектными литералами, поэтому использование таких методов массива, как .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);
2 голосов
/ 18 июня 2019

В вашей функции .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}
});
2 голосов
/ 18 июня 2019

Вам нужно использовать только 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...