Возьмите массив объектов и отсортируйте их в меньшие массивы, отсортированные по алфавиту - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь преобразовать массив объектов, который выглядит следующим образом:

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 и вставить их в массив с соответствующей буквой.

Прямо сейчас мой код берет первую букву каждого из заголовков и создает массив массивов для каждой буквы

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Используйте функцию 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)
0 голосов
/ 04 сентября 2018

Вам не нужна переменная 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);
0 голосов
/ 04 сентября 2018

Как насчет:

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, проверяем первую букву атрибута title текущего элемента этого массива, затем проверяем, является ли эта буква ключом в нашем новом словаре, d. Если нет, мы добавим эту букву в качестве ключа в d. Затем мы добавляем текущий элемент из allApps в список значений для этого ключа. Вот и все!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...