Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Удалить из массива пустые элементы (https://javascript.ru/forum/misc/45065-udalit-iz-massiva-pustye-ehlementy.html)

рони 13.02.2014 23:37

Дзен-трансгуманист,
в чём разница? :-?
function test(c) {
    for (var d = 5, a = 0, b = 0; b < c.length; b++) a *= d, a += c[b], d++;
    return a
};
alert([test([0,0,0,1]),test([0,0,1,0]), test([0,1,0,0]),test([1,0,0,0])]);

Дзен-трансгуманист 13.02.2014 23:59

рони,
Стоп, это уже полный бардак...

Сначала я подумал, что твоя функция должна возвращать размер. Но, видимо, на самом деле она возвращает индекс.

Тогда вопрос, откуда твоему универсальному преобразователю заранее известно, какие диапазоны x, y, z и т.д. я от нее требую?
А что если размерность такая: [2][122][2][9999]? То есть, в чем тут универсальность?

Ты наверно решил, что последовательность 5,6,7 арифметическая, или что? Я же эти цифры от фонаря придумал))) Цель была проста: показать, что многомерный массив известной величины можно легко свести к одномерному. Что собственно и происходит на практике в языках, где они поддерживаются. :)

Дзен-трансгуманист 14.02.2014 00:06

рони,
Смотри, я меняю только размерность, строка 25, всё остальное то же самое.
// Multidimensional to single dimension representation

var m2sdim = ( function () {

  var argNames = 'abcdefghijklmnopqrstuvwxyz'.split('');

  return function ( /* arguments */ ) {

    var dimension = arguments.length;
    var fnSource = argNames[0];
    var size = +arguments[0];

    for ( var i = 1; i < dimension; i++ ) {
      fnSource = '(' + fnSource + '*' + +arguments[i] + '+ +' + argNames[i] + ')';
      size *= +arguments[i];
    }

    var fn = Function.apply( null, argNames.slice( 0, dimension ).concat( 'return ' + fnSource ));
    fn.size = size;

    return fn;
  };
})();

var test = m2sdim(2,122,2,9999);

console.log([
  test.toString(),
  test(0,0,0,1),
  test(0,0,1,0),
  test(0,1,0,0),
  test(1,0,0,0),
  test.size // размер массива
].join('\n'));

Обрати внимание на исходник скомпилированной функции.
Аргументы идут с первого, коэффициенты - со второго. Вот и весь компот. :)

рони 14.02.2014 00:28

Дзен-трансгуманист,
ок!

рони 14.02.2014 00:52

Дзен-трансгуманист,
специальный выпуск с предварительной инициализацией :dance: :thanks:

function m(c) {
     return function (d) {
         for (var b = 0, a = 0, e = c[b]; b < d.length;) a *= e, a += d[b], e = c[++b];
         return a
     }
 };

var test = m([2,122,2,9999])
alert([test([0,0,0,1]),test([0,0,1,0]), test([0,1,0,0]),test([1,0,0,0])]);

Дзен-трансгуманист 14.02.2014 01:30

function m(c) {
     return function (d) {
         for (var b = 0, a = 0, e = c[b]; b < d.length;) a *= e, a += d[b], e = c[++b];
         return a
     }
 };

var dim = [2,122,2,9999];
var test = m(dim)
dim.pop(); // ой!
alert([test([0,0,0,1]),test([0,0,1,0]), test([0,1,0,0]),test([1,0,0,0])]);

рони,
Ну а в целом, да, кратко и понятно. Для примера сойдет. :)

рони 14.02.2014 01:53

Цитата:

Сообщение от Дзен-трансгуманист
Ну а в целом, да, кратко и понятно. Для примера сойдет

непонял что вы хотели этим сказать что в коде нет защиты от дурака?

function m(k) {
    var c = k.join('.').split('.');
    return function (d) {
        if (c.length != d.length) return -1;
        for (var a = 0, b = 0, e = c[a]; a < d.length;) {
            if (d[a] >= c[a]) return -1;
            b *= e;
            b += d[a];
            e = c[++a]
        }
        return b
    }
};

var dim = [2,122,2,9999];
var test = m(dim)
dim.pop(); // ой!
alert([test([0,0,0,1]),test([0,0,1,0]), test([0,1,0,0]),test([1,0,0,0])]);

Дзен-трансгуманист 14.02.2014 14:43

Цитата:

Сообщение от рони
непонял что вы хотели этим сказать что в коде нет защиты от дурака?

Про защиту от дурака сказано в "// ой!".
Но отдельно я намекаю на то, что хоть для демонстрации этого достаточно, но в реальных задачах, где требуются тысячи и миллионы преобразований в секунду, пробежка по массиву будет тормозом. Почему я сразу сделал такое решение - линейное выражение быстрее цикла. :)
Конечно, еще я должен был бы раскрыть скобки, так как это способствует распараллеливанию. Но поленился.

рони 14.02.2014 14:47

Дзен-трансгуманист,
ок!


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