【问题标题】:Javascript ForEach on Array of Arrays数组数组上的 Javascript ForEach
【发布时间】:2020-07-22 15:18:47
【问题描述】:

我正在循环浏览一组博客文章,首先将博客作者的用户名和 ID 推送到一个新的数组数组中,然后计算每个作者的博客数量。下面的代码实现了这一点;但是,在新数组中,用户名和作者 ID 不再是数组中单独的项目,而是似乎连接成一个字符串。我需要将它们作为单独的项目保留,因为我需要单独使用它们;我该如何修改结果以实现这一目标?

    var countAuthors = [];
    blogAuthors = await Blog.find().populate('authors');
    blogAuthors.forEach(function(blogAuthor){
        countAuthors.push([blogAuthor.author.username, blogAuthor.author.id]);
        
    })
    console.log(countAuthors);
    // Outputs as separate array items, as expected:
    //   [ 'author1', 5d7eed028c298b424b3fb5f1 ],
    //   [ 'author2', 5dd8aa254d74b30017dbfdd3 ],
    var result = {};
    countAuthors.forEach(function(x) {
        result[x] = (result[x] || 0) + 1;
    });

    console.log(result);
    //  Username and author ID become a single string and cannot be accessed as separate array items
    //  'author1,5d7eed028c298b424b3fb5f1': 15,
    //  'author2,5dd8aa254d74b30017dbfdd3': 2,

更新:

也许我可以进一步解释为什么要这样做。我的目标是一个表格,其中显示博客作者的姓名以及他们撰写的博客数量。但是,我还希望作者姓名链接到他们的个人资料页面,这需要 blogAuthor.author.id 这样做。因此,在执行计数后,我仍然需要能够分别访问作者用户名和 ID。谢谢

【问题讨论】:

  • 我不确定你在期待什么。 result[x] = ... 正在尝试设置result 的属性x,在这种情况下x 是一个数组。您想要一个由数组keyed 的对象吗?这样的事情在javascript中是不可能的。
  • 或者你想要一个同时拥有 author 和 id 键的对象?换句话说{ "author1": 15, "author1,5d7eed028c298b424b3fb5f1": 15, "author2": 2, "5dd8aa254d74b30017dbfdd3": 2 }?

标签: javascript arrays foreach


【解决方案1】:

你可以使用 String.split()。 例如:

let result = 'author1,5d7eed028c298b424b3fb5f1'.split(',')

将结果设置为:

['author1' , '5d7eed028c298b424b3fb5f1']

然后您可以像这样单独访问它们:

result[1] //'5d7eed028c298b424b3fb5f1'

【讨论】:

  • 谢谢 我确实考虑过拆分 - 但是,作者的用户名中也有可能包含逗号,这使解决方案变得复杂。
【解决方案2】:

您的问题是您没有在 foreach 回调中拆分 x,因此整个数组被转换为字符串并在插入结果对象时用作键。

您可以使用数组解构来拆分作者姓名和博客 ID,并使用它们选择性地向结果对象添加新条目,然后更新该结果。

countAuthors = [
  ['author1', 'bookId1'],
  ['author2', 'bookId2'],
  ['author1', 'bookId3'],
  ['author1', 'bookId4'],
  ['author2', 'bookId5']
]

var result = {};

countAuthors.forEach(([author, id]) => {
  if (result[author] === undefined) {
    result[author] = {count: 0, blogIds: []};
  }
  result[author].count += 1;
  result[author].blogIds.push(id);
});

console.log(result);

【讨论】:

  • 谢谢,我假设了这一点,但是当我 console.log 这样的结果时,它似乎只返回 { 'author1': 2, 'author2': 1 },我不知道'在结果中根本看不到返回的 ID?
  • 抱歉,我没有看到想要将 id 保留在子数组中的内容。我已经更新了我的答案:看看正在添加的对象,然后立即更新!
  • 谢谢,这似乎越来越近了,尽管我不得不删除If (result[author] === undefined) {,因为它抛出了错误,“无法读取未定义的属性推送”。我能理解你为什么包括那条线吗?如果我删除它,输出是: 1{ 'author1': { count: 1, blogIds: [ 5dd8abe24d74b30017dbfdd6 ] }, author2: { count: 1, blogIds: [ 5ec4a45872954100170363dd ] }`。虽然所有元素都在那里,但每条记录的计数都返回 1 而不是正确的数字。另外,我将如何单独访问每个元素?
猜你喜欢
  • 2017-04-22
  • 2018-09-11
  • 2018-05-12
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 2015-03-26
相关资源
最近更新 更多