JSON 编码的数组从 PHP 传递到 HTML 文档。目前还不清楚如何将该数组解构为 javascript 可用的片段。例如,考虑以下 HTML:
<div id="options">{"foo":[{"id":1},{"id":3}], "bar":[{"id":2},{"id":4}]}</div>
此数组中唯一先验已知的元素是键 id
存在。我知道,索引可以通过
var data = JSON.parse($("#options").text());
$.each(data, function(index) {
// index will be foo & bar
});
用例是使用索引和 id 向文档中的元素添加属性。我还没有偶然发现返回与每个索引关联的 id 的技术。如何最好地做到这一点?
编辑 - 用例澄清 - 长话短说
我想根据实体的属性(在 Symfony 应用程序中)重新启用表单上的某些选项。禁用的选项无法修改,但也不会保留 - 它们的值设置为 null。我构建了一项服务来确定禁用的选项元素并将这些元素作为 JSON 对象发送到表单文档。我现在假设在创建表单之前不知 Prop 体选项。在上面的示例中,foo
& bar
代表可能的选项,id对应于选项。例如,Household
实体可能有Reason
已选择但禁用“低工资”选项(id = 3)。这将显示为 ...id="options">{"reasons":[{"id":3}]}<...
。我将使用此信息删除 disabled="disabled"
Reason, id=3(即 id="household_reasons_3"
)字段的复选框集中的属性。我希望这是有道理的。
根据请求编辑 #2 - 创建对象的 PHP 代码。
getMetatData()
的结果出现在文档中 #options
。从上面的编辑中,家庭实体是 $object
.
public function getMetaData($object) {
$data = array();
$className = get_class($object);
$metaData = $this->em->getClassMetadata($className);
foreach ($metaData->associationMappings as $field => $mapping) {
if (8 === $mapping['type']) {
$data[$field] = $this->extractOptions($object, $field);
}
}
return json_encode($data);
}
private function extractOptions($object, $field) {
$data = [];
$method = 'get' . ucfirst($field);
$itemName = substr($field, 0, -1);
$getter = 'get' . ucfirst($itemName);
$entity = $object->$method();
foreach ($entity as $item) {
if (method_exists($item, 'getEnabled') && false === $item->getEnabled()) {
$data[] = ['id' => $item->getId()];
}
}
return $data;
}
最佳答案
早在达到无限猴子极限之前,我就偶然发现了一种方法来创建我正在寻找的结果。我感谢所有要求澄清的人。所以,对于对象
{"foo":[{"id":1},{"id":3}], "bar":[{"id":2},{"id":4}] }
脚本
var data = JSON.parse($("#options").text());
var i = 0
var output = [];
$.each(data, function(index, item) {
$.each(item, function(k, v) {
output[i] = "household_" + index + "_" + v.id;
i++;
});
});
output;
产生这个:
[“household_foo_1”、“household_foo_3”、“household_bar_2”、“household_bar_4”]
我得到了我需要的字符串;我可以从这里拿走它。
关于javascript - 解构 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39985782/