将对象数组按字母顺序分成较小的数组排序

3

我将尝试将一个对象数组进行转换,它看起来像这样:

var allApps = [
 {
  title: "amazon",
  summary: "lorem ipsum"
 },
 {
  title: "facebook",
  summary: "lorem ipsum"
 },
 {
  title: "twitter",
  summary: "lorem ipsum"
 },
 {
  title: "flipp",
  summary: "lorem ipsum"
 }
]

将其转化为类似于这样的形式:

var titles= {
A: [
    {      
     title: "amazon",
     summary: "lorem ipsum"
    }
],
F: [
     {
      title: "facebook",
      summary: "lorem ipsum"
     },
     {
      title: "flipp",
      summary: "lorem ipsum"
     }
],
T: [
     {
      title: "twitter",
      summary: "lorem ipsum"
     }
   ]
}

到目前为止,我已经有了这个:
        var letters = [];
        var titles = [];
        for (var i = 0; i < allApps.length; i++) {
            title = allApps[i].title;
            if (title=="") {
                continue;
            }
            var firstLetter = title.substring(0,1);
            var arrayWithFirstLetter = titles[firstLetter];
            if (arrayWithFirstLetter == null) {
                titles[firstLetter] = [];
                letters.push(firstLetter);
            };
        }

我希望根据应用程序的标题属性对其进行排序,并将它们推入与相应字母对应的数组中。

目前,我的代码提取每个标题的第一个字母,并为每个字母创建一个数组的数组。


如果在不同的对象中有 title: Twittertitle: Twitch,你会遇到问题吗? - Scott Marcus
3
看起来你想根据每个对象的 title 键的第一个字母创建键 (A, F, T)。你需要的输出结果应该是一个对象(你当前的输出是一个数组),但在对象中不能有重复的键。 - Scott Marcus
@ScottMarcus 没错,我不想要重复的键。以 F 为例,我希望 F 数组包含标题以 F 开头的两个对象。 - Mandalina
@ScottMarcus 为什么要重复键?只会有一个 ABC,... - 就像现在 Ffacebookflipp 一样。 - Andreas
显示剩余2条评论
3个回答

1
怎么样:
var allApps = [
 {
  title: "amazon",
  summary: "lorem ipsum"
 },
 {
  title: "facebook",
  summary: "lorem ipsum"
 },
 {
  title: "twitter",
  summary: "lorem ipsum"
 },
 {
  title: "flipp",
  summary: "lorem ipsum"
 }
]

var d = {};
for (var i=0; i<allApps.length; i++) {
  var l = allApps[i].title.substring(0,1);
  // ensure object has key
  if (!d[l]) d[l] = [];
  d[l].push(allApps[i]);
}

console.log(d)

这个日志记录了:
{
  a: [
    { title: 'amazon', summary: 'lorem ipsum' }
  ],
  f:[
    { title: 'facebook', summary: 'lorem ipsum' },
    { title: 'flipp', summary: 'lorem ipsum' }
  ],
  t: [
    { title: 'twitter', summary: 'lorem ipsum' }
  ]
}

这里的想法是我们只需循环遍历allApps,检查该数组当前成员的标题属性的第一个字母,然后检查该字母是否已经是我们新字典d中的键。如果不是,则将该字母作为键添加到d中。然后,我们将allApps中的当前元素添加到该键的值列表中。就这样!

1
使用reduce函数,从当前对象中获取第一个字符。这个第一个字符将是关键字。如果该关键字存在,则更新其值。

var allApps = [{
    title: "amazon",
    summary: "lorem ipsum"
  },
  {
    title: "facebook",
    summary: "lorem ipsum"
  },
  {
    title: "twitter",
    summary: "lorem ipsum"
  },
  {
    title: "flipp",
    summary: "lorem ipsum"
  }
]
let k = allApps.reduce(function(acc, curr) {
  let getFirstChar = curr.title.charAt(0).toUpperCase();

  if (acc[getFirstChar] === undefined) {
    acc[getFirstChar] = [];
  }
  acc[getFirstChar].push(curr)
  return acc;



}, {})
console.log(k)


一旦你知道如何使用reduce方法,这个内容就会变得更易于阅读和理解。 - klewis

0

你不需要变量letters。你应该将其推入titles[firstletter]

titles应该被初始化为一个对象,而不是一个数组。

var allApps = [
 {
  title: "amazon",
  summary: "lorem ipsum"
 },
 {
  title: "facebook",
  summary: "lorem ipsum"
 },
 {
  title: "twitter",
  summary: "lorem ipsum"
 },
 {
  title: "flipp",
  summary: "lorem ipsum"
 }
];

var titles = {};
for (var i = 0; i < allApps.length; i++) {
  title = allApps[i].title;
  if (title == "") {
    continue;
  }
  var firstLetter = title.substring(0, 1).toUpperCase();
  if (!titles[firstLetter]) {
    titles[firstLetter] = [];
  };
  titles[firstLetter].push(allApps[i]);
}

console.log(titles);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接