如何根据特定函数对数组进行分组?
how to group an array based on a specific function?
在这里,我是JavaScript的新手。我正在解决问题;但是,我在理解将多个方法链接在一起时遇到问题。我一直在努力理解这个解决方案,但是花了我很多时间,我仍然没有理解。
我知道我会根据我选择的具体功能输入我需要更改的数组。我了解所有方法的功能,但我不了解它们的语法,所以有人可以向我解释每个步骤吗?
const group_By = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val, i) => {
acc[val] = (acc[val] || []).concat(arr[i]);
return acc;
}, {});
尽量少说。
首先他们计算一个三元表达式,在这里他们检查输入是否是一个函数,如果是他们按原样传递它,否则他们创建一个匿名函数来尝试访问给定的 属性。冒号后面的箭头函数看起来有点混乱,但它仍然只是一个函数。它接受一个名为 val
的参数,以及 returns 属性 哪个键在 fn 变量中。
typeof fn === 'function' ? fn : val => val[fn]
下一步是为每个元素创建一个具有新值的新数组。此步骤的输出只是用于对元素进行分组的值列表。
例如用 fn='length'
在数组 ["a", "bb"]
上调用它会 return [1,2]
arr.map(typeof fn === 'function' ? fn : val => val[fn])
然后他们在输出数组上调用 .reduce
函数。 reduce 函数的目的是从所有缓慢迭代它的元素中创建一个值。您可以知道最后一步 return 的累加器值返回,并且它作为第一个参数传递给在下一个元素上调用的函数。最后的空对象只是累加器的初始值。
.reduce((acc, val, i) => {
...
return acc;
}, {});
最后是积累的步骤。这里首先使用映射结果中的 val
来访问新创建的对象的 属性 。如果该值不存在,它将替换为一个空数组 || []
。具有相同索引处的初始数组的元素连接到它上面。如果有一些元素,它只会向其中添加新元素并重新分配值。
acc[val] = (acc[val] || []).concat(arr[i]);
好的,我从你的查询中了解到你正在尝试将多个函数链接在一起。
function Chained() {
// this reference.
const _this_ = this
this.Function1 = () => // do something and return _this_
this.Function2 = () => // do something here and return _this_
}
在上面您可以看到链是一个简单的对象,return将“this”作为上下文。在上下文中,我们已经有了 Function1 和 Function2。因此,以下内容将有效。
const _ExecuteChained = new Chained()
// Now you can run _ExecuteChained.Function1().Function2() and so on.
现在开始你的代码。
const group_By = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val,
i) => {
acc[val] = (acc[val] || []).concat(arr[i]);
return acc;
}, {});
这里你只是 运行 arr
上的一个循环并验证第二个参数是否是一个函数如果函数然后 return 它是(因为你正在使用map
它将存储在给定的索引处。否则只需获取给定键处的函数值并 return 它。
减少。
在 Reduce 中,您试图在给定索引 arr
的给定值处累积一个给定值(联系、合并或扩展),在这种情况下是函数。
在这里,我是JavaScript的新手。我正在解决问题;但是,我在理解将多个方法链接在一起时遇到问题。我一直在努力理解这个解决方案,但是花了我很多时间,我仍然没有理解。
我知道我会根据我选择的具体功能输入我需要更改的数组。我了解所有方法的功能,但我不了解它们的语法,所以有人可以向我解释每个步骤吗?
const group_By = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val, i) => {
acc[val] = (acc[val] || []).concat(arr[i]);
return acc;
}, {});
尽量少说。
首先他们计算一个三元表达式,在这里他们检查输入是否是一个函数,如果是他们按原样传递它,否则他们创建一个匿名函数来尝试访问给定的 属性。冒号后面的箭头函数看起来有点混乱,但它仍然只是一个函数。它接受一个名为 val
的参数,以及 returns 属性 哪个键在 fn 变量中。
typeof fn === 'function' ? fn : val => val[fn]
下一步是为每个元素创建一个具有新值的新数组。此步骤的输出只是用于对元素进行分组的值列表。
例如用 fn='length'
在数组 ["a", "bb"]
上调用它会 return [1,2]
arr.map(typeof fn === 'function' ? fn : val => val[fn])
然后他们在输出数组上调用 .reduce
函数。 reduce 函数的目的是从所有缓慢迭代它的元素中创建一个值。您可以知道最后一步 return 的累加器值返回,并且它作为第一个参数传递给在下一个元素上调用的函数。最后的空对象只是累加器的初始值。
.reduce((acc, val, i) => {
...
return acc;
}, {});
最后是积累的步骤。这里首先使用映射结果中的 val
来访问新创建的对象的 属性 。如果该值不存在,它将替换为一个空数组 || []
。具有相同索引处的初始数组的元素连接到它上面。如果有一些元素,它只会向其中添加新元素并重新分配值。
acc[val] = (acc[val] || []).concat(arr[i]);
好的,我从你的查询中了解到你正在尝试将多个函数链接在一起。
function Chained() {
// this reference.
const _this_ = this
this.Function1 = () => // do something and return _this_
this.Function2 = () => // do something here and return _this_
}
在上面您可以看到链是一个简单的对象,return将“this”作为上下文。在上下文中,我们已经有了 Function1 和 Function2。因此,以下内容将有效。
const _ExecuteChained = new Chained()
// Now you can run _ExecuteChained.Function1().Function2() and so on.
现在开始你的代码。
const group_By = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val,
i) => {
acc[val] = (acc[val] || []).concat(arr[i]);
return acc;
}, {});
这里你只是 运行 arr
上的一个循环并验证第二个参数是否是一个函数如果函数然后 return 它是(因为你正在使用map
它将存储在给定的索引处。否则只需获取给定键处的函数值并 return 它。
减少。
在 Reduce 中,您试图在给定索引 arr
的给定值处累积一个给定值(联系、合并或扩展),在这种情况下是函数。