【问题标题】:Taking form field names and values creating a JSON Schema采用表单字段名称和值创建 JSON 模式
【发布时间】:2018-06-16 20:38:13
【问题描述】:

我有一个由 JSON 响应生成的表单,并且每个字段名称 (Shopping_Orders_OrderInfo_ContactID) 都包含一个嵌套对象结构

例如这个 JSON 部分

 "Shopping": {
  "Orders": {
   "OrderInfo": {
     "OrderNumber": "",

将构造以下字段名

<input type="text" name="Shopping_Orders_OrderInfo_OrderNumber" value="D0102864">

这是其他字段

 <input type="text" name="Shopping_Orders_OrderInfo_ContactID" value="AS76372">
 <input type="text" name="Shopping_Orders_OrderInfo_OrderDate" value="01/01/2018">
 <input type="text" name="Shopping_Orders_OrderInfo_Billing_BillingID" value="B673472">
 <input type="text" name="Shopping_Orders_OrderInfo_Billing_Name" value="Fred Smith">
 <input type="text" name="Shopping_Orders_OrderInfo_Delivery_DeliveryID" value="D769397">
 <input type="text" name="Shopping_Orders_OrderInfo_Delivery_Name" value="Joe Blogg">
 <input type="text" name="Shopping_Orders_OrderInfo_Discount_DiscountValue" value="10">
 <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_NumberofItems" value="1">
 <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_0_ProductID" value="P5763868">
 <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_0_ItemName" value="Big Blue Box">
 <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_0_Price" value="10">
 <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_1_ProductID" value="P57638262">
 <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_1_ItemName" value="Big Red Box">
 <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_1_Price" value="20">

我需要一个 Javascript 函数来获取上述字段名称及其值并重建如下所示的 JSON 方案。基本上,它会查看字段名称并计算出嵌套的对象/数组和带有值的键。

 {
  "Shopping": {
  "Orders": {
   "OrderInfo": {
    "OrderNumber": "D0102864",
    "ContactID": "AS76372",
    "OrderDate": "01/01/2018",
    "Billing": {
     "BillingID": "B673472",
     "Name": "Fred Smith"
     },
    "Delivery": {
    "DeliveryID": "D769397",
     "Name": "Joe Blogg"
     },
     "Discount": {
      "DiscountValue": "10"
      },
     "OrderProduct": {
      "NumberofItems": "2",
       "Items": {
        "Item": [
        {
         "ProductID": "P5763868",
         "ItemName": "Big Blue Box",
         "Price": "10",
         },
        {
         "ProductID": "P57638262",
         "ItemName": "Big Red Box",
         "Price": "20",
        }
      ]
     }
    }
   }
  }
 }
} 

下面是我试图反映上述过程的函数

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

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

function getValues(object) {
function iter(o, p) {
    if (o && typeof o === 'object') {
        Object.keys(o).forEach(k => iter(o[k], p.concat(k)));
    } else {
        result.push([p, o]);
    }
}

var result = [];
iter(object, []);
return result;
 }

//// here im not sure how to grab the fields and values from above 
var object = data['shopping'],
values = getValues(object),
objectFromValues = {};


 values.forEach(([keys, value]) => setValue(objectFromValues, keys, value));

  console.log(objectFromValues);
  console.log(values)

【问题讨论】:

    标签: javascript json forms


    【解决方案1】:

    您可以获取所有输入元素并获取名称并通过下划线将其拆分为新对象的路径和值,并使用给定信息构建一个新对象。

    allInputs 是一个类似数组的对象,可以通过借用数组方法进行迭代。

    setValue 中,reduce 回调检查下一个键是否为字符串数值,并将数组作为默认对象而不是对象。

    function setValue(object, path, value) {
        var last = path.pop();
    
        path.reduce((o, k, i, kk) => o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {}), object)[last] = value;
    }
    
    var object = {},
        allInputs = document.getElementsByTagName('input');
    
    Array.prototype.forEach.call(allInputs, ({ name, value }) => setValue(object, name.split('_'), value));
    
    console.log(object);
    <input type="text" name="Shopping_Orders_OrderInfo_OrderNumber" value="D0102864">
    <input type="text" name="Shopping_Orders_OrderInfo_ContactID" value="AS76372">
    <input type="text" name="Shopping_Orders_OrderInfo_OrderDate" value="01/01/2018">
    <input type="text" name="Shopping_Orders_OrderInfo_Billing_BillingID" value="B673472">
    <input type="text" name="Shopping_Orders_OrderInfo_Billing_Name" value="Fred Smith">
    <input type="text" name="Shopping_Orders_OrderInfo_Delivery_DeliveryID" value="D769397">
    <input type="text" name="Shopping_Orders_OrderInfo_Delivery_Name" value="Joe Blogg">
    <input type="text" name="Shopping_Orders_OrderInfo_Discount_DiscountValue" value="10">
    <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_NumberofItems" value="1">
    <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_0_ProductID" value="P5763868">
    <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_0_ItemName" value="Big Blue Box">
    <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_0_Price" value="10">
    <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_1_ProductID" value="P57638262">
    <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_1_ItemName" value="Big Red Box">
    <input type="text" name="Shopping_Orders_OrderInfo_OrderProduct_Items_Item_1_Price" value="20">

    【讨论】:

    • 太棒了!非常感谢尼娜。花了几个小时试图让它正常工作。我将立即选择此作为最佳答案!一个小小的想法,Shopping_Orders_OrderInfo_OrderProduct_NumberofItems 并不是一个真正的字段,它只是根据数组 Item 中的项目数递增”:[{
    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 2014-04-09
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多