【问题标题】:How to efficiently get a collection that contains multiple nested collections如何有效地获取包含多个嵌套集合的集合
【发布时间】:2017-04-02 19:08:31
【问题描述】:

标题可能不是最好的,非常感谢改进!

我的意思其实是很简单的问题:

假设我有一个 School 类,其中包含一个 Students 数组,其中包含一个 Notebooks 数组,我想在我的 School 中引用所有 Notebooks

public class School{
  students: Student[];
}

public class Student{
  notebooks: Notebook[]
}

我应该如何参考我学校的所有笔记本?

寻找一种更有效的方法,将所有Notebooks 保存在一个单独的数组中,通过for 循环实现..

提前致谢:)

【问题讨论】:

  • 你打算用notebooks做什么?您可以使用许多数组函数filtersomeeveryforEachreducemap?
  • @adam-beck 感谢您的快速回复。我想一起展示它们并在它们上做一些 CRUD
  • 你没有把 Javascript 和 Java 混为一谈吗?至少现在,Javascript 没有使用 public 关键字。它是reserved,但尚未实际使用。
  • @hindmost 和typescript 你可以使用public :)

标签: arrays performance typescript collections nested


【解决方案1】:

这完全取决于您想对输出或每个单独的笔记本做什么?此函数可紧密复制到 for 循环,而无需所有样板。

school.students.forEach(function(student) {
  student.notebooks.forEach(function(notebook) {
    doSomethingWithNotebook(notebook);
  });
});

// this returns all notebooks for all students and puts it into a single (flat) array
var allNotebooks = school.students.reduce(function(collection, student) {
  return collection.concat(sudent.notebooks);
}, []);

// now you can do things like filter out only New notebooks
var newNotebooks = allNotebooks.filter(notebook => notebook.isNew);

【讨论】:

  • reduce 的快速解释或链接会很好
  • reduce() 方法对累加器和数组的每个值(从左到右)应用一个函数,以将其减少为单个值。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… JS 的一个相当复杂(但强大)的功能。 Egghead.io 有一整门课程egghead.io/lessons/…
  • 哦,这很酷,所以第一个参数(collection)是上次迭代的返回值。好的,谢谢,我想这样就可以了:)
  • 是的。你会注意到我提供了一个空数组作为 reduce 的第二个参数(第一个参数是回调函数)。这是reduce 的初始值,是可选的。同样,可能需要一些时间才能理解,但一旦您开始定期使用它,它就会改变游戏规则。
  • 是的,这是我即将提出的问题 - 我们从什么开始?呵呵感谢亚当,掌握后看起来非常有用:)
【解决方案2】:

从概念上讲,我的反应是寻找类似 n 维数组/矩阵的东西,想想

myMatrix[ [school][student][notebook[]] ]

(但语法有效), 然后弄清楚如何拉出 myMatrix[[anything][anything][Notbooks[]]]。

这最终会避免 for 循环,但是任何可以让您选择所有 3 嵌套元素的东西,我很确定,无论是否存储嵌套的元素,它都会变得一样复杂。

本身不是一个明确的答案,但没有更多关于你需要什么的细节,我能做的最好的就是提供思路。

【讨论】:

  • 实际上这是需要考虑的事情,因为我确实需要将 em 分组并与他们的Students 相关,但我不确定它是否比仅仅保持基本层次结构给我更好的访问权限原样
猜你喜欢
  • 2016-05-16
  • 2023-03-31
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 2016-07-03
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多