Вопрос по arrays, javascript – Получить следующий и предыдущий элементы в массиве JavaScript

4

У меня есть большой массив с непоследовательными идентификаторами, который выглядит примерно так:

PhotoList[89725] = new Array();
PhotoList[89725]['ImageID'] = '89725';
PhotoList[89725]['ImageSize'] = '123';
PhotoList[89726] = new Array();
PhotoList[89726]['ImageID'] = '89726';
PhotoList[89726]['ImageSize'] = '234';
PhotoList[89727] = new Array();
PhotoList[89727]['ImageID'] = '89727';
PhotoList[89727]['ImageSize'] = '345';
Etc....

Я пытаюсь выяснить, учитывая идентификатор, как я могу получить следующий и предыдущий идентификатор ... чтобы я мог сделать что-то вроде этого:

<div id="current">Showing You ID: 89726 Size: 234</div>
Get Prev Get Next

Очевидно, что если мы находимся в конце или в начале массива, мы просто сообщение ...

Ваш Ответ

8   ответов
5

& APOS; Далее & APOS; к этому массиву?

PhotoList[89725] = new Array();
PhotoList[89725]['Prev'] = 89724;
PhotoList[89725]['Next'] = 89726;
PhotoList[89725]['ImageID'] = '89725';
PhotoList[89725]['ImageSize'] = '123';

Это просто «двусвязный список» структура данных.

3

кроме как последовательно перебирать возможные идентификаторы, пока не найдете тот, который имеет запись в вашем массиве. Например:

function findClosest(arr, id, increasing) {
    var step = increasing ? 1 : -1;
    for(var i=id+step; i>=0 && i<=max_id; i+=step)
        if( arr[id] )
            return id;
}

Очевидно, что этот подход требует, чтобы вы отслеживали max_id, чтобы вы не повторялись вечно; здесь я предполагаю, что это глобальная переменная, но вы можете сделать ее параметром дляfindClosest функция. Вы бы назвали эту функцию так:

var prev = findClosest(arr, id, false);
var next = findClosest(arr, id, true);
0

images = {
    0: {
        size: 12345, /* dont realy need as you can use JS to mesure the size. */
        title: "day 1 on holiday"
    },
    1: {
        size: 13549, /* dont realy need as you can use JS to mesure the size. */
        title: "day 2 on holiday"
    },
    2: {
        size: 16548, /* dont realy need as you can use JS to mesure the size. */
        title: "day 3 on holiday"
    },
}

for(x in images){
    /* x = "the id of the image." */
    url[] = "/images/" + x + ".png";
    title[] = images[x].title;
    size[] = images[x].size;
    console.log("File: " + url[x] + " , Title: " + title[x] + " , Size: " + size + "bytes")
}
Что здесь думаешь? Ваша индексация объекта с номерами, начинающимися с нуля. Как это лучше, чем использовать массив?
Хотя это правда, это не помогает ответить на вопрос; op определил, что они хотят вычислить, что представляют собой предыдущий и следующий идентификаторы, с учетом известного ключа, где другие ключи не обязательно являются последовательными.
-3

что ваш список изображений будет взят из БД, так что вы можете попробовать этот код, этот код работает для меня.

<?
    $prev="";
    $next="";
    $cur=0;
    $i=0;
    $pid=$_GET['pid'];
    while($rowcon=mysql_fetch_assoc($result))
    {       
        $arr[$i]=$rowcon['pid'];
        if($rowcon['pid']==$pid)
        {
            $cur=$i;
        }
        $i++;
    }   
    if($cur<$num_rows)
        $next=$arr[$cur+1];
    else
        $next="";
    if($cur>0)
        $prev=$arr[$cur-1];
    else
        $prev="";
    echo $prev."   ".$cur."   ".$next;
?>
вопрос о javascript не php
0
var sibNum = 0;
var sibList = [];
var prevSiblingID = false;
for (n in w) {
   sibNum++;
   sibList[n] = {
      title : n,
      prevSiblingID : prevSiblingID
   };
       if (prevSiblingID) {
          sibList[prevSiblingID].nextSiblingID = n;
   }
   prevSiblingID = n;
};
sibList[prevSiblingID].nextSiblingID = false;
1

вы должны использовать объекты, а не массив. Также убедитесь, что вы создаете новые массивы, используя буквенную нотацию, а не новое ключевое слово со встроенными типами. Новое ключевое слово - плохая новость, и вы можете заглушить глобальный объект. Проверьте JSLint.

var a = new Array(); //bad dont use
var a = []; //this is the best way to create a new array
var o = {}; //create new objects like this

Что касается проблемы под рукой. Почему бы не написать простой контейнер, который имеет свой внутренний счетчик?

function PhotoListContainer(PhotoList)
{
    if(PhotoList === undefined)
        throw("no photo list");

    this.counter = 0;
    var self = this;

    this.current = function(){
         return PhotoList[self.counter];
    };

    this.next = function(){
        return PhotoList[self.counter + 1];
    };

    this.prev = function(){
        return PhotoList[self.counter - 1];
    };

    // You could even write a function that loops each value from the current counter :)
    this.each_from_counter = function(callback){
        for(var i = self.counter; i < PhotoList.length; i++)
        {
             callback(PhotoList[i], i);
             self.counter++;
        }        
    };

}

//use 

var pc = new PhotoListContainer(PhotoList);
pc.counter = 500;
pc.next(); //returns the 501st object
pc.prev(); //returns the 499th object
pc.each_from_counter(function(photo, index){
     photo.somehting;
});
5

Это еще один способ написания вашего примера. new Array () действительно не то, что вы должны использовать, потому что это объекты, которые вы создаете. Кроме того, я оставил числа в виде строк, но я не уверен, почему вы захотите это сделать. Вы можете добавить следующий и предыдущий, как предложил Куй

PhotoList[89725] = {ImageID: '89725',
                    ImageSize: '123'};
PhotoList[89725] = {ImageID: '89726',
                    ImageSize: '234',
                    Next: '89727',
                    Prev: '89725'};
PhotoList[89725] = {ImageID: '89727',
                    ImageSize: '345'};

Все они доступны так же, как ваша другая структура.

Я второй Джерри. Забудьте о массивах. PhotoList также должен быть объектом. var PhotoList = {89725: {ImageID: 89725, размер изображения: 123, следующий: 89726}, 89725: {} и т. д ...
-1

ий элемент указанного массива:

object = $.grep(data, function(e) {
            if(e.id == yourId) {
                return data[data.indexOf(e) + 1]; // or -1 for prev item
            }
     });

Похожие вопросы