解构JSON对象

时间:2016-10-11 20:04:01

标签: javascript jquery json

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对象发送到表单文档。我现在假设在创建表单之前不知道特定选项。在上面的示例中,foo&amp; bar表示可能的选项,而id对应于该选项。例如,Household实体可能选择Reason个选项,但禁用&#34;低工资&#34; (id = 3)。这将显示为...id="options">{"reasons":[{"id":3}]}<...。我会使用此信息从Reason,id = 3(即disabled="disabled")字段的复选框集中删除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;
}

1 个答案:

答案 0 :(得分:0)

在达到无限的猴子限制之前很久,我偶然发现了一种方法来创建我正在寻找的结果。我要感谢所有推动澄清的人。所以,对于对象

{"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"]

我得到了我需要的琴弦;我可以从这里拿走它。