У меня разные объекты 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: здесь мы видим консольный вывод. Если вам нужно больше разъяснений, спросите пожалуйста.
Заранее спасибо!
Я сделал скрипку, которая делает именно это для вас:
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);
Поскольку вы уже поняли, как сохранить счетчик и сбросить его для каждой новой группы, вы можете сделать
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}]
Во-первых, позвольте отсортировать массив:
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
0-3
,5-7
,9-10
и12
? нет?