【问题标题】:how to sort array by groups with javascript?如何使用javascript按组对数组进行排序?
【发布时间】:2013-10-25 09:23:20
【问题描述】:

我有一个包含 12 个条目的数组。我喜欢按标题对它们进行排序。许多文章都有相同的标题,我可以很容易,因为标题是相同的。 最后我可能是 3 或 4 组。

我有非常小的 javascript 代码,因为我不知道我是想用循环还是其他方式来做。

Javascript

 var totalGroups = [];
        var actualGroup = [];

var contentarticles = articles.contentarticles,
                article,
                $out = $("#articlesOutput");


                for (var i = 0; i < contentarticles.length; i++) {
                    if (!article || article.title != contentarticles[i].title) {
                        article = contentarticles[i];

                        document.getElementById('articleForNaviTopTitle').innerHTML = article.title;
                        document.getElementById('articleForNaviTopID').innerHTML = article.id;

                        var articlesOutput = [
                            '<li><a href="./certifiedTraining/id=', article.id, '/step=', i + 1, '">',
                            article.title,
                            '</li>'
                        ].join("");
                        $out.append(articlesOutput);
                    }
                }
// till this point all works fine, and a code above gives results in the image below.

//**Im struggeling right there, how to sort this array by groups?????**

while (article.title(this) == article.title(next))
  {
  code block to be executed
  }

【问题讨论】:

  • 你想sort,还是聚合成桶?此外,您似乎遇到了一些非 ASCII 字符的编码问题。
  • 查看右侧的图像。它只是一个从 0 到 11 的数组列表。但我想让它按组排序。一组应该是具有相同标题的文章。也许我应该使用对象而不是数组?
  • 在计算机编程中,“排序”通常意味着“排序”。听起来您的意思实际上是“收集”。
  • 顺便说一句,帖子中的图像很烦人,因为我们无法将它们剪切并粘贴到 Javascript 控制台中。请发布 Javascript 文字说明您拥有什么以及您想要获得什么。

标签: javascript jquery arrays sorting group-by


【解决方案1】:

如果我理解正确,您想要的是挑选出每个对象并按标题分组排序。如果我是你,我会看看UnderScore js。这是一个很好的 js 实用程序集合。

var grouped = _.groupBy(yourObjects, 'title');

【讨论】:

  • -> 更好的解决方案!很简单
【解决方案2】:

不确定我是否理解“按组排序数组”的意思。假设您想按标题对数组进行排序;那么你会得到类似的东西:

contentarticles.sort(function(a, b) {
    if (a.title > b.title) return 1;
    if (a.title < b.title) return -1;
    return 0;
 });

但如果这不是你想要的结果,你能说得更清楚些吗?你想做什么来过滤掉重复项?创建“数组数组”?还是什么?

如果你想分组而不是排序:

var articles = contentarticles.reduce(function(articles, article) {
    (articles[article.title] || (articles[article.title] = [])).push(article);
    return articles;
}, {});

通过这种方式,您将拥有一个对象,其中属性是它自己的标题,每个属性将包含一个包含完整文章对象的数组。所以,一旦你有了标题,你就可以获得所有具有相同标题的文章。如果你想要一个所有标题的列表,你可以使用Object.keys;如果你想迭代,你可以使用for…in

这里是我使用的reduce 方法。

【讨论】:

  • 查看右侧的图像。它只是一个从 0 到 11 的数组列表。但我想让它按组排序。一组应该是具有相同标题的文章。也许我应该使用对象而不是数组?在我的数组中应该至少有 3 个这样的标题相同的组。
  • 很清楚你现在拥有什么,但不是你想获得哪种结构。我会尝试在答案中举一些例子,但你必须更明确一点。
  • 不错的代码——我从没想过要使用reduce,我一直在写这种东西,里面有一个带有if的显式循环。
  • ok ZERO 我会测试它是如何工作的,我现在就给你!我想我用了错误的术语“排序”我只需要说“排序”
  • 请注意,在这种情况下不是“订购”,至少对我而言。它只是在同一组下“收集”具有相同属性的项目。所以它更多的是“分组”。但让我知道这是否符合您的预期。请注意,我更新了代码是因为一个错误。
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 2022-11-02
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2016-12-23
  • 2020-07-17
  • 1970-01-01
相关资源
最近更新 更多