我正在做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,
"";
}
}
那仍然没有多大意义?
答案 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
循环比较起来,这是“必要的”循环,这意味着您作为程序员来逐步指导计算机做什么。