【问题标题】:How to sort an array of objects containing different information about newspaper articles?如何对包含有关报纸文章的不同信息的对象数组进行排序?
【发布时间】:2021-08-11 07:45:33
【问题描述】:

我正在尝试归结一组包含有关报纸文章的不同信息的对象。我想要的是一个总结每个新闻来源信息的字符串。

每个对象都包含属性 medium、pageNumber 和 day。媒体总是有一个字符串值,但 pageNumber 和 day 属性可以是字符串或 null。

示例 1:day 属性为空的情况

[
  { medium: "The New York Times", pageNumber: "6", day: null },
  { medium: "The New York Times", pageNumber: "12", day: null },
  { medium: "The Wall Street Journal", pageNumber: "6", day: null },
  { medium: "USA Today", pageNumber: "15", day: null },
  { medium: "USA Today", pageNumber: "8", day: null },
  { medium: "USA Today", pageNumber: "32", day: null },
  { medium: "Daily Mail", pageNumber: "12", day: null },
  { medium: "Huffington Post", pageNumber: null, day: null }
]

想要的输出:

"The New York Times, page 6, 12; The Wall Street Journal, page 6; USA Today, page 8, 15, 32; Daily Mail, page 12; Huffington Post"

示例 2:day 属性有值的地方

[
  { medium: "The New York Times", pageNumber: "6", day: "saturday" },
  { medium: "The New York Times", pageNumber: "12", day: "monday" },
  { medium: "The Wall Street Journal", pageNumber: "6", day: "sunday" },
  { medium: "USA Today", pageNumber: "15", day: "monday" },
  { medium: "USA Today", pageNumber: "8", day: "monday" },
  { medium: "USA Today", pageNumber: "32", day: "saturday" },
  { medium: "Daily Mail", pageNumber: "12", day: "sunday" },
  { medium: "Huffington Post", pageNumber: null, day: "sunday" }
]

想要的输出:

"The New York Times, saturday, page 6, monday, page 12; The Wall Street Journal, monday, page 6; USA Today, saturday, page 32; monday, page 8, 15; Daily Mail, sunday, page 12; Huffington Post, monday"

请注意,如果媒体不是实体的(如果它不是真正的实体报纸而是没有页码的网络媒体),pageNumber 属性值将为空。在这种情况下,它应该被省略。另请注意,如果一种媒体有多个页码,则应按从低到高排序。

输出应该是一个字符串。每个媒体在输出中只应表示一次。

我希望这一切都有意义.. 几天来我一直在努力解决这个问题,但我就是找不到解决问题的方法。

【问题讨论】:

  • 这是一个分组问题:您想按 medium 对结果进行分组。因此,只需使用媒体名称和整理的日期和页码值构建一个对象,然后最后将其转换为所需格式的字符串。 Array.prototype.reduce 可能是一个很好的起点。

标签: javascript arrays sorting object


【解决方案1】:

不过,工作日没有排序。

const references1 = [
  { medium: "The New York Times", pageNumber: "6", day: null },
  { medium: "The New York Times", pageNumber: "12", day: null },
  { medium: "The Wall Street Journal", pageNumber: "6", day: null },
  { medium: "USA Today", pageNumber: "15", day: null },
  { medium: "USA Today", pageNumber: "8", day: null },
  { medium: "USA Today", pageNumber: "32", day: null },
  { medium: "Daily Mail", pageNumber: "12", day: null },
  { medium: "Huffington Post", pageNumber: null, day: null }
];

const references2 = [
  { medium: "The New York Times", pageNumber: "6", day: "saturday" },
  { medium: "The New York Times", pageNumber: "12", day: "monday" },
  { medium: "The Wall Street Journal", pageNumber: "6", day: "sunday" },
  { medium: "USA Today", pageNumber: "15", day: "monday" },
  { medium: "USA Today", pageNumber: "8", day: "monday" },
  { medium: "USA Today", pageNumber: "32", day: "saturday" },
  { medium: "Daily Mail", pageNumber: "12", day: "sunday" },
  { medium: "Huffington Post", pageNumber: null, day: "sunday" }
];

const summarize = arr => Object.entries(arr.reduce( (acc, reference) => {
    // Map the attributes into a hieararchy.
    ((acc[reference.medium]||={})[reference.day||'']||=[]).push(reference.pageNumber);
    return acc;
  }, {}))
  .map(([medium, references]) => { // Handle each medium separately.
    const details = Object.entries(references).map(([day, pageNumbers]) => {
      // Sort the page numbers ignoring nulls.
      pageNumbers = pageNumbers.filter(v=>v).sort((a,b)=>a-b);
      return day + ( pageNumbers.length 
        ? (day ? ', ': '') + 'page ' + pageNumbers.join(', ') 
        : '' );
    }).join(', ')
    return medium + (details ? ', '+details : '');
  }).join('; ');

console.log(summarize(references1));
console.log(summarize(references2));

【讨论】:

  • 谢谢..这是一个很好的解决方案..现在我必须破译它并了解到底发生了什么:)期待..
  • 禁用 .map() 也可以看到中间结果。
【解决方案2】:

如果您使用lodash 库,您可以轻松实现这一点。如果没有,您可以编写纯 javascript 函数来替代以下答案中使用的 lodash 函数。

我希望这至少能给你一些解决这个用例的方向。

const getSummary = (posts) => {
  let summary = '';
  const groupedByMedium = _.groupBy(posts, 'medium');
  _.map(groupedByMedium, (posts, medium) => {
    if (summary.length > 0) {
        summary += '; ';
    }

    summary += medium;
    
    postsGroupedDay = _.groupBy(posts, 'day');

    _.map(postsGroupedDay, (dayPosts, day) => {
        const pages = _.join(_.sortedUniq(_.map(dayPosts, p => (p.pageNumber))), ', ');

        if (summary.length > 0 && (pages.length > 0 || day !== 'null')) {
            summary += ', ';
        }

        if (day !== 'null') {
            summary += day;
            if (pages.length > 0) {
              summary += ', ';
            }
        }
        
        if (pages.length > 0) {
          summary += `page ${pages}`;
        }
    });
  });

  return summary;
}

你的实现:

const ex1 = [
  { medium: "The New York Times", pageNumber: "6", day: null },
  { medium: "The New York Times", pageNumber: "12", day: null },
  { medium: "The Wall Street Journal", pageNumber: "6", day: null },
  { medium: "USA Today", pageNumber: "15", day: null },
  { medium: "USA Today", pageNumber: "8", day: null },
  { medium: "USA Today", pageNumber: "32", day: null },
  { medium: "Daily Mail", pageNumber: "12", day: null },
  { medium: "Huffington Post", pageNumber: null, day: null }
];

getSummary(ex1);

输出:The New York Times, page 6, 12; The Wall Street Journal, page 6; USA Today, page 15, 8, 32; Daily Mail, page 12; Huffington Post

const ex2 = [
  { medium: "The New York Times", pageNumber: "6", day: "saturday" },
  { medium: "The New York Times", pageNumber: "12", day: "monday" },
  { medium: "The Wall Street Journal", pageNumber: "6", day: "sunday" },
  { medium: "USA Today", pageNumber: "15", day: "monday" },
  { medium: "USA Today", pageNumber: "8", day: "monday" },
  { medium: "USA Today", pageNumber: "32", day: "saturday" },
  { medium: "Daily Mail", pageNumber: "12", day: "sunday" },
  { medium: "Huffington Post", pageNumber: null, day: "sunday" }
];

getSummary(ex2);

输出:The New York Times, saturday, page 6, monday, page 12; The Wall Street Journal, sunday, page 6; USA Today, monday, page 15, 8, saturday, page 32; Daily Mail, sunday, page 12; Huffington Post, sunday

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 2015-02-17
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多