Javascript получить последовательность объектов из массива

0

У меня разные объекты javascript, все они имеют свойство "row".

var row1 = {
    row: 1
};

var row2 = {
    row: 2
};

var row3 = {
    row: 3
};

var row4 = {
    row: 4
};

...

У меня есть массив, определяемый следующим образом:

var objArray = [];

В этом массиве возможно иметь несколько "строк". Последовательность всегда те же, начиная с нижней строки и заканчивая более высокой строкой.

Теперь я хочу получить объекты, которые связаны друг с другом (например, 4 строки). В моем случае это также возможно иметь 3 в ряд, 5 в ряд и так далее..

Пример:

objArray.push(row0);
objArray.push(row1);
objArray.push(row2);
objArray.push(row3);
objArray.push(row5);
objArray.push(row6);
objArray.push(row7);
objArray.push(row9);
objArray.push(row10);
objArray.push(row12);

В этом случае мне нужны 2 списка, 1 содержащие строки от 0 до 3 и один, содержащий от 5 до 7.

Я немного пробовал в этом JSFiddle: здесь мы видим консольный вывод. Если вам нужно больше разъяснений, спросите пожалуйста.

Заранее спасибо!

  • 0
    В вашем примере, конечно, вы должны ожидать 4 списков: 0-3 , 5-7 , 9-10 и 12 ? нет?
  • 1
    Позвольте мне получить это прямо - вы хотите сделать массив среза из n элементов, начиная с объекта, у которого свойство строки равно определенному значению? Или вы хотите сделать массив массива из n элементов (тогда почему свойство строки должно иметь значение вообще)?
Показать ещё 7 комментариев
Теги:

3 ответа

1
Лучший ответ

Я сделал скрипку, которая делает именно это для вас:

    for(var i = 0; i < objArray.length; i++) {
    if(currentnum !== -1)
    {
         var result = objArray[i].row - currentnum;
        currentnum = objArray[i].row;
        if(result === 1)
        {
         currentarray.push(objArray[i]);   
        } else {
            arrayofarrays.push(currentarray);
            currentarray = [];
            currentarray.push(objArray[i]);
        }
    }  else {
        currentnum = objArray[i].row;
        currentarray.push(objArray[i]);
    }
}
arrayofarrays.push(currentarray);

http://jsfiddle.net/B76a8/6/

1

Поскольку вы уже поняли, как сохранить счетчик и сбросить его для каждой новой группы, вы можете сделать

var counter = 1,
    lastIndex = 0;

//see chrome dev tools, I need to return objects beginning at the 3rd place untill the 7th place in the array
//how do I get these objects? 
for (var i = 0; i < objArray.length; i++) {

    if ((i < objArray.length - 1 && objArray[i].row + 1 == objArray[i + 1].row) ||  
       (i == objArray.length - 1 && objArray[i - 1].row == objArray[i].row - 1)) {
        counter++;
    } else {
        // here we output the grouped items
        console.log(objArray.slice(lastIndex, counter+lastIndex));
        lastIndex = counter+lastIndex;
        counter = 1;
    }
}

Демо на http://jsfiddle.net/B76a8/7/

вывод

[Object {row = 0}, Object {row = 1}]
[Object {row = 3}, Object {row = 4}, Object {row = 5}, Object {row = 6}, Object {row = 7}, Object {row = 8}]
[Object {row = 10}]

0

Во-первых, позвольте отсортировать массив:

objArray.sort(function(a,b){ return a.row - b.row });

Тогда для данного n это должно вернуть вам следующий и предыдущий элементы:

function getElement(array, n)
{
 var ret = [];
 for (var i=0; i<array.length; i++)
   if (array[i].row == n)
   {
    if (i > 0) ret.push(array[i-1]);
    if (i < array.length-1) ret.push(array[i+1]);
   }

 return ret;
}

Поскольку получение всех других вариантов с одним и тем же цветом - это другая вещь, пусть это позволяет:

function getByColor(array, color)
{
 var ret = [];
 for (var i=0; i<array.length; i++)
  if (array[i].color == color)
   ret.push(array[i]);

 return ret;
}

Затем вы можете объединить оба массива, используя concat

Ещё вопросы

Сообщество Overcoder
Наверх
Меню