Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Заполнение массива (https://javascript.ru/forum/misc/24589-zapolnenie-massiva.html)

BorodinKO 06.01.2012 20:00

Заполнение массива
 
Можно ли заполнить массив из N элементов одним значением, не обращать к каждому элементу в отдельности?

Livaanderiamarum 06.01.2012 20:07

нельзя заполнять элементы не обращаясь к ним

monolithed 06.01.2012 20:13

Цитата:

Сообщение от BorodinKO
Можно ли заполнить массив из N элементов одним значением, не обращать к каждому элементу в отдельности?

alert(Array(10).join('foo|'));

Livaanderiamarum 06.01.2012 20:18

Цитата:

Сообщение от monolithed (Сообщение 148438)
alert(Array(10).join('foo|'));

к сожалению ему это не подходит(

monolithed 06.01.2012 20:55

Цитата:

Сообщение от Livaanderiamarum
к сожалению ему это не подходит(

интересно услышать это от него

Livaanderiamarum 06.01.2012 20:57

Цитата:

Сообщение от monolithed (Сообщение 148441)
интересно услышать это от него

Мне тоже, все думаю что он имел ввиду, быстродействие(в ячейках массива ссылки на одно значение), или отсутствие ручного труда(for)

FINoM 06.01.2012 21:25

alert(Array(10).join('foo|').split('|'));

monolithed, наверно ты это имел в виду.

monolithed 06.01.2012 21:25

Цитата:

Сообщение от Livaanderiamarum
отсутствие ручного труда(for)

можно и без циклов:

alert(Array(10).join(0).split(''));


Доп.
FINoM, конечно, просто я не дописал в надежде, что суть понятна)

BorodinKO 06.01.2012 21:28

быстродействие скорей, масив двумерный, довольно большой и очищается полностью "=false" 40 раз в в секунду...

Livaanderiamarum 06.01.2012 21:29

Цитата:

Сообщение от BorodinKO (Сообщение 148449)
быстродействие скорей, масив двумерный, довольно большой и очищается полностью "=false" 40 раз в в секунду...

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

п.с. ребята, я же говорил))) он быстродействие имел ввиду) я как всегда умница)

var q = 200

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

или если у тебя в них хранятся разные значения, а потом они все должны очищаться,то проще удали массив, и пересоздай пустым.

slagemer1 07.03.2015 20:14

Array.prototype.assign = function(value,a,b,c,d){

//value - значение, на которое нужно изменить элементы
//a - начальный элемент по оси x, c - конечный элемент по оси x
//b - начальный элемент по оси y, d - конченый элемент по оси y

  try{
    var self = this[b];
    var func = arguments.callee;
    var before = self.slice(0,a);
    var after = self.slice(c,self.length-1);
    var arr = new Array(c-a+1);
    arr = arr.join(value+"[|]").split("[|]");
    arr[arr.length-1] = value;
    this[b] = before.concat(arr).concat(after);
    if(b===d) return this;
    else{
      b++;
      return func.apply(this,arguments);
    }
  }catch(e){
    if(e){
      throw{
        array: this,
        message: e.message
      };
    }
  }

}

рони 07.03.2015 21:01

slagemer1,
а что на входе что на выходе можно пример?

Erolast 07.03.2015 21:49

Цитата:

//value - значение, на которое нужно изменить элементы
//a - начальный элемент по оси x, c - конечный элемент по оси x
//b - начальный элемент по оси y, d - конченый элемент по оси y
Сразу назвать переменные по-нормальному - для слабаков.

slagemer1 09.03.2015 09:50

Вот более улучшенная функция, она подходит как для заполнения матричного массива, так и линейного:

Array.prototype.assign = function func(form){

  var self;
  form.type = form.type || "matrix";
  var map=function(a,i,e){
    if(i>=form.ax && i<=form.bx && (!form.drop || (i-form.ax+1)%form.drop!==0)){
      if(form.callback) return form.callback(a,i,e);
      else return form.value;
    }else return a;
  }
  
  if(form.type==="inline"){
    self = this;
    func.arr = self.map(map);
    self.splice(0,self.length);
    self.push.apply(self,func.arr);
    return self;
  }else if(form.type==="matrix"){
    self = this[form.ay];
    func.arr = self.map(map);    
    this[form.ay] = func.arr;
    if(form.ay===form.by) return this;
    else{
      form.ay++;
      return func.apply(this,arguments);
    }
  }

}

//value - присваиваемое значение
//callback - возвращаемая функция для каждого подходящего под случай элемента массива
//ax - начальный индекс по X, bx - конченый индекс по X
//ay - начальный индекс по Y, by - конченый индекс по Y
//drop - не присваивать каждому значению, индекс которого равен drop (начало от ax), значение value
//type - тип массива (inline - линейный, matrix - матричный) по умол. матрчный

var arr = [0,0,0,0,0,0,0,0,0,0,0];
arr.assign({value: 1, ax:1, bx:7, drop: 2, type: 'inline'}); //[0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0]

function rename(a,i){
  return i+': Full';
}
var arr = ['Empty','Empty','Empty','Empty','Empty','Empty'];
arr.assign({callback: rename, ax: 0, bx: 4, drop: 2, type: 'inline'}); //["0: Full", "Empty", "2: Full", "Empty", "4: Full", "Empty"]

var arr = [[0,0,0],[0,0,0],[0,0,0]];
arr.assign({value: 1, ax: 0, ay: 0, bx: 1, by: 1, type: 'matrix'}); //[Array[3]->[1,1,0],Array[3]->[1,1,0],Array[3]->[0,0,0]]

var arr = [[0,0,0],[0,0,0],[0,0,0]];
arr.assign({value: 1, ax: 0, ay: 0, bx: 2, by: 2, drop: 3, type: 'matrix'});
/* |1 1 1|
   |1 1 1|
   |0 0 0| */

Erolast 09.03.2015 10:39

Цитата:

arguments.callee;
Начиная с ES5 arguments.calle использовать запрещено. В строгом режиме твой код не запустится.

slagemer1 09.03.2015 11:32

Ну так а в чем проблема изменить на function func(){...} ? Переделал пример данным образом - пожалуйста

P.S. у меня с "use strict" запускается


Часовой пояс GMT +3, время: 02:41.