无法了解.reduce如何在JavaScript中工作

时间:2019-08-29 05:04:46

标签: javascript arrays object

我正在做JavaScript练习,并遇到了以下问题:

编写一个JavaScript函数,该函数接受字符串作为参数并在字符串中找到最长的单词。 字符串示例:“ Web开发教程”(开发)

我找到了一个解决方案,就像这样:

function longest(str) {
  let arr = str.split(' ');

  return arr.reduce((a,b) => a.length < b.length ? b : a, "");
}

console.log(longest('Web Development Tutorial'));

上面的代码确实有效,但我听不懂 arr.reduce((a,b) => a.length < b.length ? b : a, "") 部分。

是不是

reduce(function(a, b) {
  if (a.length < b.length) {
    b
  } else {
    a,
      "";
  }
}

那仍然没有多大意义?

5 个答案:

答案 0 :(得分:2)

给出了一些很好的答案。查看正在发生的情况的一种方法是放入console.log。只需看一下这段代码,您就会知道发生了什么:

function longest(str) {
  let arr = str.split(' ');

  return arr.reduce((a,b) => {
	  console.log(`a=${a}, b=${b}`); 
	  return a.length < b.length ? b : a;
  }, "");
}

console.log(longest('Web Development Tutorial'));

输出应为自我解释。 但是,如果您不了解箭头函数或模板字符串文字,则需要先学习它们才能理解输出。

答案 1 :(得分:1)

premium的第一个参数是累加器,它是从上一次回调返回的值,或者是初始值(它是数组中的第一个参数,或者是传递给{{ 1}})。

等同于以下内容:

reduce

或者,删除条件运算符:

reduce

请记住,当箭头功能在function longest(str) { let arr = str.split(' '); let a = ''; // initial value arr.forEach((b) => { a = a.length < b.length ? b : a; }); return a; } 之后缺少function longest(str) { let arr = str.split(' '); let a = ''; // initial value arr.forEach((b) => { if (b.length > a.length) { a = b; } }); return a; } 时,将隐式返回{之后的表达式,因此

=>

也等同于

=>

答案 2 :(得分:1)

reduce的工作原理类似于一个循环,涉及一个值(数组中的当前项)和一个累加器(该值是从上一次调用该函数返回的值,或传递给{{1 }}。

由于reduce的目的是将数组缩小成单个值,因此您可以这样想:

reduce

请注意,let a = ""; arr.forEach(item => { if (a.length < b.length) { a = b; } else { a = a; } }); return accumulator; 语句与上面的代码无关,但是它表示else的工作方式。也尝试查找它-this是很好的指南。

答案 3 :(得分:1)

如果您要使用if重写代码,则将是:

function longest (a, b) {
    if (a.length < b.length) {
        return b;
    }
    else {
        return a;
    }
}

return arr.reduce(longest, "");

请注意,当reduce开始循环时,第二个reduce参数("")将累加器变量(a)初始化为该值(空字符串)。该语法与箭头函数有些混淆,因为实际上它只是逗号分隔reduce的参数时,可能会误认为逗号运算符。

答案 4 :(得分:1)

019-08-29T05:11:26.796Z error [shim:lib/handler.js] [arthurchannel3-6cfe6442] Calling chaincode Init() returned error response [Error: object type or attribute not a non-zero length string]. Sending ERROR message back to peer 将多个(或不确定的)值转换为单个值。

它以一个初始值开始,我们将其称为“累加器”和一个二进制函数(“ binary”是指具有两个形式参数的函数),我们将其称为“ reducer”。 reduce将减速器应用于累加器和列表的第一个元素。 Reducer函数的返回值将成为新的累加器。这就是为什么我们称其为“累加器”,因为它会累加或收集减速器的结果。 reduce重复此过程,直到列表中没有更多元素为止,然后从化简器返回最后一个返回值。

一些应用程序:

总结数字列表

reduce

在这种情况下,const add = (x, y) => x + y [1, 2, 3, 4].reduce(add, 0) // 10 是累加器,x是列表元素。 如果我们在头脑上执行这个化简器,我们将:

y

从表的数据模型中计数表列

x: 0, y: 1
x: 1, y: 2
x: 3, y: 3
x: 6, y: 4
x: 10, STOP

理货

const columnReducer = (tally, {layout}) => {
  const isFullLayout = layout === 'full'
  const isCompleteSemiLayout = tally.semiLayouts === 2
  const columns = isFullLayout || isCompleteSemiLayout ? tally.columns + 1 : tally.columns
  const semiLayouts  = 
      isCompleteSemiLayout ? 0
    : !isFullLayout ? tally.semiLayouts + 1
    : tally.semiLayouts

  return { columns, semiLayouts };
}

const { columns } = rows.reduce(columnReducer, { columns: 0, semiLayouts: 0});

const materialsReducer = (items, { id, material }) => ({ ...items, [material]: { tally: items[material] || 0 + 1, ids: [...items[material] || [], id] } }) [ { id: 1, material: 'wood' }, { id: 2, material: 'gold' }, { id: 3, material: 'wood' } ].reduce(materialsReducer, {}) // { wood: { tally: 2, ids: [1, 3] }, gold: { tally: 1, ids: [3] } } 是“声明性的”,表示您作为程序员描述了所需的结果。与reduce循环比较起来,这是“必要的”循环,这意味着您作为程序员来逐步指导计算机做什么。