JavaScript相当于PHP的compact()方法?

时间:2015-08-24 03:36:23

标签: javascript php node.js

在PHP中,你可以这样做:

$hello = "world";
$goodbye = "everyone";
$whatever = "taco";
$something = 5;
$hey = false;
$myArray = compact('hello','goodbye','whatever','something','hey');

现在您有以下数组:

[
  'hello' => 'world',
  'goodbye' => 'everyone',
  'whatever' => 'taco',
  'something' => 5,
  'hey' => false
]

在vanilla JavaScript或NodeJS库中有这样的东西吗?

3 个答案:

答案 0 :(得分:1)

The PHP.js project致力于将所有PHP的本机函数移植到JavaScript。

紧凑型功能可用here,我也会在下面复制它。

function compact() {
  //  discuss at: http://phpjs.org/functions/compact/
  // original by: Waldo Malqui Silva (http://waldo.malqui.info)
  // improved by: Jack
  //    input by: Brett Zamir (http://brett-zamir.me)
  // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  //   example 1: var1 = 'Kevin'; var2 = 'van'; var3 = 'Zonneveld';
  //   example 1: compact('var1', 'var2', 'var3');
  //   returns 1: {'var1': 'Kevin', 'var2': 'van', 'var3': 'Zonneveld'}

  var matrix = {},
    that = this;

  var process = function(value) {
    var i = 0,
      l = value.length,
      key_value = '';
    for (i = 0; i < l; i++) {
      key_value = value[i];
      if (Object.prototype.toString.call(key_value) === '[object Array]') {
        process(key_value);
      } else {
        if (typeof that.window[key_value] !== 'undefined') {
          matrix[key_value] = that.window[key_value];
        }
      }
    }
    return true;
  };

  process(arguments);
  return matrix;
}

答案 1 :(得分:0)

JavaScript无法使用用户定义的函数从当前符号表中读取。

您需要以另一种方式构建它,例如使用对象。

var obj = {
  'hello': 'world'
};

如果使用全局对象(浏览器中为window)使用全局对象或使用不应使用的eval(),其他选择是查找它们。

答案 2 :(得分:0)

开箱即用?不可以。但是,您可以利用Array.prototype.reduce之类的内容。

如果您的变量都附加到全局window对象,那么您可以执行以下操作:

function compact() {
  var args = Array.prototype.slice.call(arguments);

  return args.reduce(function(t, c) {
    if(c in window) t[c] = window[c];

    return t;
  }, {});
}

输出绑定到window

output

这将利用以下事实:在浏览器环境中,全局变量的范围限定为window对象。如果您没有window对象怎么办?这样做:

function compact() {
  var args = Array.prototype.slice.call(arguments);

  return args.reduce(function(t, c) {
    if(c in this) t[c] = this[c];

    return t;
  }.bind(this), {});
}

compact('some', 'global', 'variables');

这必须发生在顶级(即,无论你的全球环境在哪里)。

输出绑定到this

output2