javascript - PHP $$var 的 JS 等价物是什么?
问题描述
我有一个带有动态字段的表单。我想在提交之前格式化一些序列化数据。我需要在 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';
我看到我们可以window[var]
在 JS 中使用,但我无法让它工作,我尝试了这个:
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));
解决方案
您可以直接获取对象并获取设置值的路径。这种方法检查键,如果它是一个数组的数字作为默认值。如果给定一个数组或对象,它不会改变数据结构。
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);
推荐阅读
- c# - Json.NET - 在 winforms 中反序列化和解析 json 数据
- oracle - 登录sqlplus并在dockerfile中执行sql文件
- xslt-2.0 - XML合并两个文件不起作用
- python - 如何根据每日价格数据计算月收益?
- mediawiki - Mediawiki 的导航框模板未在个人 wiki 中显示框
- c# - 在我的 ASP.Net MVC 应用程序中,我真正需要多少个连接字符串?
- node.js - 谷歌表格客户端未定义节点
- kendo-ui - 从下拉列表中过滤剑道网格列
- java - 带有 envers 的应用程序在模式验证上失败:REV 列的类型错误 - 找到 [int8 (Types#BIGINT)],但期望 [int4 (Types#INTEGER)]
- javascript - 从浏览器建立任意 TCP 连接