Каковы альтернативы eval в JavaScript?

import pandas as pd
custom_dict = {'March':0,'April':1,'Dec':3}

df = pd.DataFrame(...) # with columns April, March, Dec (probably alphabetically)

df = pd.DataFrame(df, columns=sorted(custom_dict, key=custom_dict.get))

возвращает DataFrame со столбцами March, April, Dec

13
задан Community 23 May 2017 в 12:26
поделиться

7 ответов

function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
    var args = [i1, i2, i3, i4, i5, i6, i7, i8]; // put values in an array
    this.i = [];
    for (var i=0,j=0 ;i<8;i++) { // now i goes from 0-7 also
        var k = args[i]; // get values out
        if (k > 0) {
            this.i[j++] = k;
        }
    }
}

Приведенный выше код может быть упрощен дальше, я только что сделал минимальное изменение для избавления от EVAL . Вы можете избавиться от j , например:

function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
    var args = [i1, i2, i3, i4, i5, i6, i7, i8];
    this.i = [];
    for (var i = 0; i < args.length; i++) {
        var k = args[i];
        if (k > 0) { this.i.push(k); }
    }
}

эквивалентно. Или, чтобы использовать встроенный аргументы объект (чтобы избежать своего списка параметров в двух местах):

function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
    this.i = [];
    for (var i = 1; i < arguments.length; i++) {
        var k = arguments[i];
        if (k > 0) { this.i.push(k); }
    }
}

Даже если вы не фильтруете список, вы не хотите что-то делать this.i = аргументы , потому что аргументы не является реальным массивом; Он имеет свойство callee , которое вам не нужно, и отсутствует некоторые методы массива, которые вам могут понадобиться в I . Поскольку другие указали, что если вы хотите быстро преобразовать аргументы в массиве, вы можете сделать это с этим выражением:

Array.prototype.slice.call(arguments)

Вы можете использовать это вместо var args = [ I1, I2 ... Линии выше.

15
ответ дан 1 December 2019 в 19:31
поделиться

Одна альтернатива передаче массива в вашу функцию вместо отдельных аргументов:

StrippedExample([3, 1, 4, 1, 5, 9, 2, 6])

Тогда ваш код будет:

function StrippedExample(inArray) {
    this.i = [];
    for (var i=0,j=0 ;i<inArray.length;i++) {
        var k = inArray[i];
        if (k > 0) {
            this.i[j++] = k;
        }
    }
}

Если вам действительно нужно передать отдельные аргументы, вы можете доступ к ним с помощью вашего массива arguments , который является объектом, который действует как массив (хотя на самом деле это не так; не все методы Array работают с ним), который предоставляет все аргументы, которые были переданы вашей функции; в этом случае их даже не нужно объявлять, но неплохо было бы включить комментарий, указывающий, какие аргументы вы ожидаете от пользователей вашего кода:

function StrippedExample(/*i1, i2, i3, i4, i5, i6, i7, i8*/) {
    this.i = [];
    for (var i=0,j=0 ;i<arguments.length;i++) {
        var k = arguments[i];
        if (k > 0) {
            this.i[j++] = k;
        }
    }
}

Если вы гарантированно имеете только 8 элементов, тогда вы можно использовать 8 вместо inArray.length или arguments.length ; Я решил использовать более общую версию в своих примерах на случай, если она будет вам полезна.

4
ответ дан 1 December 2019 в 19:31
поделиться

Этот код должен использоваться для использования массива arguments , к которому имеет доступ каждая функция Javascript.

Дело не в том, что eval злой (он в Лиспе, поэтому он должен быть хорошим ), это просто признак взлома - вам нужно что-то, чтобы работа, и вы заставили ее. Он кричит мне: «Автор отказался от хорошего программного дизайна и просто нашел то, что работало».

1
ответ дан 1 December 2019 в 19:31
поделиться

Вы просто создают массив из аргументов вашей функции 8, удаляя те, которые меньше или равны нулю.

Следующий код эквивалентен и будет работать с любым произвольным числом аргументов:

function StrippedExample() {
  var args = [];

  for (var i = 0; i < arguments.length; i++) {
    if (arguments[i] > 0) {
      args.push(arguments[i]);
    }
  }
  //...
}
7
ответ дан 1 December 2019 в 19:31
поделиться

Учитывая фиксированное количество переменных, вы можете создать их массив вручную и просмотреть его в цикле. Но если у вас есть переменное количество аргументов, один из способов передать переменные в функцию в виде массива:

var args = Array.prototype.slice.call(arguments.callee.caller.arguments);

И ваша функция будет выглядеть так:

function StrippedExample() {
    var args = Array.prototype.slice.call(arguments.callee.caller.arguments);
    for(var i in args) {
        if (args[i] > 0) {
            this.i[j++] = args[i];
        }
    }
}
0
ответ дан 1 December 2019 в 19:31
поделиться
function StrippedExample() {

    this.i = [];
    for (var i=1,j=0 ;i<arguments.length;i++) {
        var k = arguments[i];
        if (k > 0) {
            this.i[j++] = k;
        }
    }
}
1
ответ дан 1 December 2019 в 19:31
поделиться
  1. Позвоните в функцию с одним аргументом - массивом
  2. Используйте аргументы объект
5
ответ дан 1 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

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