JS等同于PHP $$ var?

时间:2018-10-31 15:27:02

标签: javascript php arrays variables

我有一个带有动态字段的表格。我想在提交之前格式化一些序列化数据。我需要用Javascript复制PHP $$ var。

这是PHP中的想法:

我有这个:

$data = array('field1', 0, 'key');
$val = 'somevalue';

我想要这个:

$field1[0]['key'] = 'somevalue';

因此,如果我使用PHP,这是我将如何进行(我不确定它是否可以工作):

$data = array('field1', 0, 'key');
$val = 'somevalue';

$field1 = array();
$f = $data[0];           # 'field1'
$i = $data[1];           # 0
$k = $data[2];           # 'key'
$$f[$i][$k] = $val;      # $field1[0]['key'] = 'somevalue';

我看到我们可以在JS中使用window[var],但我无法使其正常工作,我尝试过:

var val = 'somevalue';
var field1 = [];
var f = data[0];
var i = data[1];
var k = data[2];

window[f][i] = {};           # field1[0] must be an object
window[f][i][k] = val;       # field1[0] = {'key': 'somevalue'}

如您所见,这不是很简单。此外,这段代码在foreach之内,因为我不仅只有一个字段,而且还有很多(field2,field3 ...)。

最后,我有类似的东西:

var result = {
  field1: field1,
  field2: field2,
  ...
  field10: field10
}

// console.log(result);
{
  field1: [
    0 : Object { key: 'somevalue', key2: 'othervalue' }
    ...
    5 : Object { key: 'somevalue2', key2: 'othervalue2' }
  ]
  field2: [...]
  ...
}

编辑:

感谢@Nina Scholz的回答:

function formatData(object, keys, value) {
    var last = keys.pop();

    keys.reduce((o, k, i, a) =>
        o[k] = o[k] || (isFinite(i + 1 in a ? a[i + 1] : last) ? [] : {}),
        object
    )[last] = value;

    return object;
}

var data = form.serializeArray();
var result = {};

$(data).each(function(i) {
    name = data[i].name;        // field name. Ex: "field1[0][key]"
    value = data[i].value;      // field value

    // Format: "field1[0][key]" => array("field1", "0", "key")
    array = name.split('[');
    array[1] = array[1].replace(']', '');
    array[2] = array[2].replace(']', '');

    // Format every array of data in a big object "result"
    formatData(result, array, value);
});

// JSON encoding of "result" in a hidden field for post-treatment
$('input[name=data]').val(JSON.stringify(result));

3 个答案:

答案 0 :(得分:1)

您可以直接采用对象并采用设置值的路径。此方法检查密钥,如果该密钥是数组的数字作为默认值。如果指定了数组或对象,则不会更改数据结构。

function setValue(object, keys, value) {
    var last = keys.pop();

    keys.reduce((o, k, i, a) =>
        o[k] = o[k] || (isFinite(i + 1 in a ? a[i + 1] : last) ? [] : {}),
        object
    )[last] = value;

    return object;
}

var val = 'somevalue',
    data = ['field1', 0, 'key'],
    result = {};

setValue(result, data, val);
console.log(result);

答案 1 :(得分:-1)

您不应动态创建变量。

let o = {};
o[f][i][k] = val;

o.field与写field没什么不同

要回答您的问题,您无法像在php中那样在javascript中做到这一点。根据记录,在PHP中这也算是不良代码。对于PHP,它会阻止编译器应用所有优化。

函数作用域与全局作用域不同。

这会将变量bar写入全局范围,而不是局部范围

var bar = 123; // global bar

(() => {
    var bar; // local bar

    window["bar"] = 456; // this is writing in global "bar", not the local one
})();

console.log(bar);

答案 2 :(得分:-2)

如果您有一个变量名数组,并且想要创建一个对象,其中键是变量名,值是变量值,那么这是一个示例:

new_path