Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 07.03.2015, 20:14
Новичок на форуме
Отправить личное сообщение для slagemer1 Посмотреть профиль Найти все сообщения от slagemer1
 
Регистрация: 07.03.2015
Сообщений: 3

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
      };
    }
  }

}

Последний раз редактировалось slagemer1, 07.03.2015 в 20:30. Причина: Добавил комментарии
Ответить с цитированием
  #12 (permalink)  
Старый 07.03.2015, 21:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

slagemer1,
а что на входе что на выходе можно пример?
Ответить с цитированием
  #13 (permalink)  
Старый 07.03.2015, 21:49
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
//value - значение, на которое нужно изменить элементы
//a - начальный элемент по оси x, c - конечный элемент по оси x
//b - начальный элемент по оси y, d - конченый элемент по оси y
Сразу назвать переменные по-нормальному - для слабаков.
Ответить с цитированием
  #14 (permalink)  
Старый 09.03.2015, 09:50
Новичок на форуме
Отправить личное сообщение для slagemer1 Посмотреть профиль Найти все сообщения от slagemer1
 
Регистрация: 07.03.2015
Сообщений: 3

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

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| */

Последний раз редактировалось slagemer1, 09.03.2015 в 11:32. Причина: Редактировал код
Ответить с цитированием
  #15 (permalink)  
Старый 09.03.2015, 10:39
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
arguments.callee;
Начиная с ES5 arguments.calle использовать запрещено. В строгом режиме твой код не запустится.
Ответить с цитированием
  #16 (permalink)  
Старый 09.03.2015, 11:32
Новичок на форуме
Отправить личное сообщение для slagemer1 Посмотреть профиль Найти все сообщения от slagemer1
 
Регистрация: 07.03.2015
Сообщений: 3

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

P.S. у меня с "use strict" запускается
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JS, <SELECT> заполнение bma2004 Общие вопросы Javascript 6 13.11.2016 13:48
Заполнение массива JS из MySQL blax Events/DOM/Window 2 01.11.2011 07:53
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53
вставка элементов массива в текстовую форму по клику olezyk Общие вопросы Javascript 3 21.03.2009 22:01