2014-09-24 3 views
0

Допустим, что у вас есть массив объектов страницы в Javascript:Лучший способ найти следующие/предыдущие элементы в массиве javascript объектов?

pages = [{uid: 1, title: 'Home'}, 
{uid: 2, title: 'Products'}, 
{uid: 3, title: 'About'}, 
{uid: 4, title: 'Contact'} 
] 

Ваша цель заключается в создании способа, который, учитывая UID текущей страницы, возвращает тот, который рядом с ним или предшествующий ему (как определено порядком в массиве).

(обновлено) Примечание: Вы не имеете доступа к текущему объекту страницы, только его UID, так что вы не можете найти свою позицию, используя просто IndexOf()

nextPage = function (pages, currentPageUID){...} 
previousPage = function(pages, currentPageUID){...} 

В Javascript, что бы самый элегантный способ сделать это? Это простая проблема, но решения, о которых я думал, не могут отразить эту простоту, и я уверен, что есть такая возможность.

БОНУС

Тот же вопрос, но для CoffeeScript? (не уверен, как я вознагражу его в качестве бонуса, но надеюсь, вы будете чувствовать себя хорошо)

+0

Рассматривали ли вы изменение структуры данных? Карта, где ключ является UUID, а значение - либо указатель на строку, либо, может быть, числовой индекс. Это концепция индекса базы данных. Если вы сделаете значение числовым индексом, вы можете просто добавить/вычесть, чтобы получить следующий/предыдущий. Если у вас есть дескриптор текущего значения, структура данных с двусвязным списком даст вам немедленный доступ к предыдущему и следующему. –

ответ

0

Это самый элегантный способ, который я могу придумать с головы. Я не проверял проверку ошибок, поэтому он просто возвращает null, если его нет.

nextPage = function (pages, currentPageUID){ 
    var i = pages.findIndex(function(p) { return p.uid === currentPageUID; }); 
    return (i > -1) ? (pages[i + 1] ? pages[i + 1] : null) : null; 
} 

previousPage = function (pages, currentPageUID){ 
    var i = pages.findIndex(function(p) { return p.uid === currentPageUID; }); 
    return (i > -1) ? (pages[i -1] ? pages[i -1] : null) : null; 
} 
Смежные вопросы