#javascript #arrays #ecmascript-6 #higher-order-functions
#javascript #массивы #ecmascript-6 #функции более высокого порядка
Вопрос:
ПРИМЕР ЖИВОГО КОДА:
Предыстория:
Пытаюсь изучить функцию более высокого порядка javascript, некоторую теорию сокращения и применяю ее на примере преобразования данных, и последние несколько часов терплю неудачу. 🙁
Вопрос:
Как я могу выполнить итерацию по approved1
или approved2
и вернуть новый объект на основе 2 случаев. Кроме того, есть ли способ сделать это с помощью функции более высокого порядка, такой Array.reduce()
как или комбинации, созданной в функциях более высокого порядка? Наконец, если конечный объект заключен в массив, это тоже нормально.
Я хочу этого по нескольким причинам:
- неизменность.
- простота тестирования.
- учебные цели.
2 случая:
-
Если все
dateApproved
значения являются!== null
(в этом примере:approval1
массив), то верните новый объект (или объект, обернутый в массив), который выглядит как:{type: 'APPROVED', approvals: [...approved1]}
-
Если какое-либо из
dateApproved
значений равноnull
(в этом примере:approval2
массив), верните новый объект (или объект, обернутый в массив), который выглядит как:{type: 'PENDING', approvals: [...approved2]}
JAVASCRIPT:
// With given logic this array evaluate with a type of 'APPROVED'
var approved1 = [
{
dateApproved: new Date(),
id: 1,
},
{
dateApproved: new Date(),
id: 2,
}
];
// With given logic this array evaluate with a type of 'PENDING'
var approved2 = [
{
dateApproved: null,
id: 1,
},
{
dateApproved: new Date(),
id: 2,
}
];
// This reducer does nothing proper right now just placeholder.
function isApproved(previousValue, currentValue, currentIdx) {
var TYPE = ['APPROVED', 'PENDING'];
if(previousValue.dateApproved !== null amp;amp; currentValue.dateApproved !== null) {
return currentValue
}
}
var x = approved1.reduce(isApproved);
console.log(x); // LOG: {type: 'APPROVED' approvals: [...approved1]}
var y = approved2.reduce(isApproved);
console.log(x); // LOG: {type: 'PENDING' approvals: [...approved2]}
Ответ №1:
Используйте Array.prototype.every:
function wrap(approvals) {
return {
type: approvals.every(a => a.dateApproved != null) ? 'APPROVED' : 'PENDING',
approvals: approvals
};
}
wrap(approved1);
// => Object {type: "APPROVED", approvals: Array[2]}
wrap(approved2);
// => Object {type: "PENDING", approvals: Array[2]}