Сортировка массива объектов в алфавитном порядке в JavaScript - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь отсортировать название ссылки в алфавитном порядке, но он говорит: level2.sort не является функцией любая помощь приветствуется!

for (let i = 0, l = finalData.length; i < l; i++) {
        const level1 = finalData[i];
        console.log('This is level 1', level1);
        for (let x = 0, y = finalData[i].links.length; x < y; x++) {
            const level2 = finalData[i].links[x];
            level2.sort((a, b) => a.name - b.name);
            console.log('This is level 2', level2);
        }
    }

Уровень 1 на[0] это {title: "resources", ссылки: Array (3)}

Уровень 2 на [0] is {name: "google", путь: "www.google.com"}

Уровень 2 в [1] - это {name: "yahoo", путь: "www.yahoo.com"}

Уровень 2 в [2] - это {name: "apple", путь:"www.apple.com"}


Уровень 1 в [1] - это {title: "TeacherEmails", ссылки: Array (2)}

Уровень 2 в [0]is {name: "JoneA", путь: "JoneA@yahoo.com"}

Уровень 2 в [1] is {name: "AndyK", путь: "AndyK@apple.com"}

и т. Д.

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Вы идете слишком глубоко здесь: const level2 = finalData[i].links[x];

Это делает level2 не массивом, из-за которого сортировка не работает.

Удалить индекс доступа: finalData[i].links;

Вам также не понадобится второй цикл for.

И использовать сортировку из MDN для строк:

// sort by name
items.sort(function(a, b) {
  var nameA = a.name.toUpperCase(); // ignore upper and lowercase
  var nameB = b.name.toUpperCase(); // ignore upper and lowercase
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }

  // names must be equal
  return 0;
});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Ваш цикл будет выглядеть так:

for (let i = 0; i < finalData.length; i++) {
    finalData[i].links.sort((a, b) => {
        var nameA = a.name.toUpperCase(); // ignore upper and lowercase
        var nameB = b.name.toUpperCase(); // ignore upper and lowercase
        if (nameA < nameB) {
           return -1;
        }
        if (nameA > nameB) {
           return 1;
        }

        // names must be equal
        return 0;
    }
}
0 голосов
/ 11 апреля 2019

Вы получаете эту ошибку, потому что level2 не является объектом Array, это массив Arguments, похожий на массив .

Если вы можете использовать внешнюю библиотеку, например lodash , вы можете сортировать, используя orderBy метод:

_.orderBy(level2, ['name'], ['asc']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...