Как расширить Array.prototype.push ()?

Собрал быстрый и грязный пример, чтобы начать. По сути, таблица с функцией 'draw' сработает при поиске или фильтровании события. Оттуда вы перебираете все видимые отфильтрованные строки, используя это: { filter : 'applied'}

Запустите этот фрагмент и найдите «Нью-Йорк». Затем проверьте консоль, чтобы увидеть, как ведут себя данные и числа.

Или эту скрипку, если вы предпочитаете ...

var mytable = new Object();

var tableData = [
    {name: 'Clark Kent', city: 'Metropolis', numCol: '10', numCol2: '6'},
    {name: 'Bruce Wayne', city: 'New York', numCol: '', numCol2: '12'},
    {name: 'Steve Rogers', city: 'New York', numCol: '30', numCol2: '10'},
    {name: 'Peter Parker', city: 'New York', numCol: '44', numCol2: ''},
    {name: 'Thor Odinson', city: 'Asgard', numCol: '55', numCol2: '15'}
	];

mytable = $('#mytable').DataTable({
    "search": {
        "regex": true
    },
	  sDom: 'lrftip',
    data: tableData,
    columns: [
    	{data: 'name', title: 'Name'},
    	{data: 'city', title: 'City'},
      {data: 'numCol', title: 'Number'},
      {data: 'numCol2', title: 'Hidden Num', visible: false}
    ], 
    columnDefs: [
        { className: "sum", "targets": [2] },
    ]
	});
  
   
mytable.on( 'draw', function () {
    console.log( 'Redraw occurred at: '+new Date().getTime() );
    var myCount = 0;
    var totalSum = 0;
    mytable.rows( { filter : 'applied'} ).every(function (rowIdx, tableLoop, rowLoop) {
            var data = this.data();
            
            console.log('num1: ' + data.numCol + ' num2: ' + data.numCol2);
            
            if (data.numCol !== '') {
            		//Add to counter                
                myCount += 1;
            }
            
            if (data.numCol2 !== '') {
            	//Sum it up	
              totalSum += parseInt(data.numCol2); 
            }
            
        });
        console.log('myCount: ' + myCount + ' totalSum: ' + totalSum);
} );

  
  

Name City Number1 Number2
Name City Number1 Number2

Надеюсь, это поможет.

28
задан maja 3 February 2015 в 16:25
поделиться

4 ответа

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

Это решение только влияет на переменную прибытия:

arr.push = function (){
    //Do what you want here...
    return Array.prototype.push.apply(this,arguments);
}

Это решение влияет на все массивы. Я не рекомендую сделать это.

Array.prototype.push=(function(){
    var original = Array.prototype.push;
    return function() {
        //Do what you want here.
        return original.apply(this,arguments);
    };
})();
71
ответ дан some 28 November 2019 в 02:25
поделиться

Вы могли сделать это этот путь:

arr = []
arr.push = function(data) {
  alert(data); //callback

  return Array.prototype.push.call(this, data);
}

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

arr.push = function(data) {
  alert(data); //callback

  //While unlikely, someone may be using psh to store something important
  //So we save it.
  var saved = this.psh;
  this.psh = Array.prototype.push;
  var ret = this.psh(data);
  this.psh = saved;
  return ret;
}

Редактирование:

, В то время как я говорю Вам, как сделать это, Вы могли бы быть лучше обслужены с использованием другого метода, который работает, обратный вызов затем просто звонит, спешат массив вместо того, чтобы переопределить нажатие. Можно закончить с некоторыми неожиданными побочными эффектами. Например, нажатие, кажется, varadic (берет переменное количество аргументов, как printf), и вышеупомянутое использования повредило бы это.

необходимо было бы сделать путаницу с _Arguments () и _ArgumentsLength () для надлежащего переопределения этой функции. Я высоко предлагаю против этого маршрута.

Редактирование еще раз: Или Вы могли использовать "аргументы", это будет работать также. Все еще отговорите от следования этим маршрутом все же.

5
ответ дан Patrick 28 November 2019 в 02:25
поделиться

Я сделал бы это:

var callback = function() { alert("called"); };
var original = Array.prototype.push;
Array.prototype.push = function()
{
  callback();
  return original.apply(this, arguments);
};

, Если Вы хотели, чтобы аргументом был обратный вызов, Вы могли бы сделать это:

var original = Array.prototype.push;
Array.prototype.push = function(callback)
{
  callback();
  return original.apply(this, Array.prototype.slice.call(arguments, 1));
}

они оба были протестированы.

-1
ответ дан cdmckay 28 November 2019 в 02:25
поделиться

Array.prototype.push был представлен в JavaScript 1.2. Это действительно настолько просто:

Array.prototype.push = function() {
    for( var i = 0, l = arguments.length; i < l; i++ ) this[this.length] = arguments[i];
    return this.length;
};

Вы могли всегда добавлять что-то перед этим.

6
ответ дан 28 November 2019 в 02:25
поделиться
Другие вопросы по тегам:

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