如何根据特定函数对数组进行分组?

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 的给定值处累积一个给定值(联系、合并或扩展),在这种情况下是函数。