что является эквивалентом свертка в JavaScript

голоса
0

Я бэкенд DEV переехал недавно на JS стороны. Я шел через учебник и наткнулся ниже фрагмент кода.

clickCreate: function(component, event, helper) {
    var validExpense = component.find('expenseform').reduce(function (validSoFar, inputCmp) {
        // Displays error messages for invalid fields
        inputCmp.showHelpMessageIfInvalid();
        return validSoFar && inputCmp.get('v.validity').valid;
    }, true);
    // If we pass error checking, do some real work
    if(validExpense){
        // Create the new expense
        var newExpense = component.get(v.newExpense);
        console.log(Create expense:  + JSON.stringify(newExpense));
        helper.createExpense(component, newExpense);
    }
}

Здесь я попытался понять многое о том , что происходит, есть нечто , называемое reduceдругое дело с именем validSoFar. Я не могу понять , что под капотом происходит. :-(

Я получаю регулярные циклы вещи , как сделано в Java.

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

Спасибо

Задан 19/09/2018 в 13:24
источник пользователем
На других языках...                            


3 ответов

голоса
0

Это разумный эквивалент:

var validExpense = true;
var inputCmps = component.find('expenseform')
for (var i = 0; i < inputCmps.length; i++) {
    // Displays error messages for invalid fields
    inputCmp.showHelpMessageIfInvalid();
    if (!inputCmp.get('v.validity').valid) {
        validExpense = false;
    }
}
// Now we can use validExpense

Это несколько странное использование reduce, чтобы быть честным, потому что он делает больше , чем просто сокращение списка до одного значения. Она также производит побочные эффекты (предположительно) в вызове showHelpMessageIfInvalid().

Идея reduceпроста. Учитывая список значений , которые вы хотите , чтобы сложить один на один раз в одно значение (одного и то же или любого другого типа), вы поставляете функцию , которая принимает текущее сложенное значение и следующее значение списка и возвращает новое сложенное значение и вы поставляете начальное сложенное значение, и reduceобъединяете их с помощью вызова функции с каждым последующим значением списка и текущим сложенным значением.

Так, например,

var items = [
  {name: 'foo', price: 7,  quantity: 3},
  {name: 'bar', price: 5,  quantity: 5},
  {name: 'baz', price: 19, quantity: 1}
]

const totalPrice = items.reduce(
  (total, item) => total + item.price * item.quantity, // folding function
  0  // initial value
); //=> 65
Ответил 19/09/2018 в 13:45
источник пользователем

голоса
0

Это не имеет смысла использовать уменьшить там и побочные эффекты в уменьшить. Лучше использовать Array.prototype.filter , чтобы получить все недействительные статьи расходов.

Затем с помощью Array.prototype.forEach производить побочный эффект (ы) для каждого недопустимого элемента. Вы можете проверить длину недействительных массива статей расходов , чтобы увидеть , что ваш вклад был действителен:

function(component, event, helper) {
  var invalidExpenses = component.find('expenseform').filter(
    function(ex){
      //return not valid (!valid)
      return !ex.get('v.validity').valid
    }
  );
  invalidExpenses.forEach(
    //use forEach if you need a side effect for each thing
    function(ex){
      ex.showHelpMessageIfInvalid();
    }
  );
  // If we pass error checking, do some real work
  if(invalidExpenses.length===0){//no invalid expense items
      // Create the new expense
      var newExpense = component.get("v.newExpense");
      console.log("Create expense: " + JSON.stringify(newExpense));
      helper.createExpense(component, newExpense);
  }
}

Документация MDN для Array.prototype.reduce имеет хорошее описание и примеры о том , как использовать его.

Он должен принять ряд вещей и вернуть одну вещь (может быть другой тип вещи). Но вы не найдете каких-либо примеров там, где побочные эффекты инициируются в функции редуктора.

Ответил 19/09/2018 в 13:42
источник пользователем

голоса
0

Функция уменьшения здесь перебор каждого входного компонента вида расходов и постепенно отображение на логическое значение. Если у вас есть сказать три входа каждый с истинной действительности, то уменьшить функция будет возвращать:

  1. true && true где первое верно, то начальное значение, переданное в уменьшить.
  2. true && true и где первый истинный здесь является результатом предыдущего результата.
  3. true && true

В конце сокращения, вы остаетесь с одним булевыми , представляющим действительность всего, где на действительность , что если только один компонентного входа является ложной, то всей сокращение составит ложь. Это происходит потому , что validSoFarследит за общую действительность и мутируют путем возвращения соединения из ли форма действительна до сих пор и справедливости текущего входа в итерации.

Ответил 19/09/2018 в 13:38
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more