Существуют ли какие-либо функции более высокого порядка для возврата объекта из массива объектов в javascript?

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