【问题标题】:How to create json object dynamically from UI using values from input fields before sending to API如何在发送到 API 之前使用输入字段中的值从 UI 动态创建 json 对象
【发布时间】:2018-01-04 20:48:54
【问题描述】:

我有一个 http.post 请求,它发送一个对象作为参数,预期的格式是这样的:

 var searchQuery;
 var subj;
 var body;
 var startDate;
 var endDate;

   {
    "search": {
      "scope": [2,3,32],
      "type": "basic",
       "text": {
              "value": searchQuery, //string variable coming from UI
              "fields": [
                     subj, body     //string variable coming from UI
              ]
       },

      "date": {
        "type": "range",
        "from": startDate,     //string variable coming from UI
        "to": endDate          //string variable coming from UI
      }

问题是一些值是可选的,这意味着如果我不提供 searchQuery 作为字符串,那么整个键值应该被忽略,例如“value”:如果我没有提供 searchqery 不应该包含在 json 对象中该变量的值。如果我不提供值,那么 startDate 和 endDate 也是如此,那么应该从 json 中忽略日期。 那么如何在来自 UI 的对象中动态包含或排除密钥对值,以及如何在发送到 post 请求之前构建该对象?

会是这样的吗?

 var search = {};
 search.text = { value: "", fields: [] };
 {value: "", fields: Array(0)}
 seach.text.value = "wes";
 search.text.value = "wes";
 search.text.fields.push("subject");
 search.text.fields.push("body"); 

【问题讨论】:

    标签: arrays json angular rest api


    【解决方案1】:

    您可以创建一个更灵活的函数。

    var searchQuery = "";
    var subj = null;
    var body = "";
    var startDate = "";
    var endDate = null;
    
    let obj = {
      "search": {
        "scope": [2, 3, 32],
        "type": "basic",
        "text": {
          "value": searchQuery, //string variable coming from UI
          "fields": [
            subj, body //string variable coming from UI
          ]
        },
    
        "date": {
          "type": "range",
          "from": startDate, //string variable coming from UI
          "to": endDate //string variable coming from UI
        }
      }
    }
    
    function removeNull(obj) {
      return Object.keys(obj).reduce((res, key) => {
        if (Array.isArray(obj[key])) {
          // If it's an array, filter out the null items
          res[key] = obj[key].filter((item) => item != null && item !== "");
        } else if (typeof obj[key] === "object" && obj[key] != null) {
          // If it's an object, call the function recursively
          res[key] = removeNull(obj[key]);
        } else if (obj[key] != null && obj[key] !== "") {
          // Otherwise, only add it to the results if it's not null
          res[key] = obj[key];
        }
        return res;
      }, {});
    }
    
    console.log(removeNull(obj));

    【讨论】:

    • 感谢您的帮助,但如果属性“value”为空“”,则应删除它。我仍在努力如何实现这一点
    • 只是一个快速的,也许你可以为“fields”显示相同的内容:[ subj, body ] 如果没有“fields”添加了 subj 或 body 所以只需清空“fileds”:[] 然后完全删除它,在此先感谢
    • 我们在哪里做res[key] = ,那是我们在结果中添加一些东西的地方。 obj[key].filter 的结果是没有空元素的数组。您需要做的就是在将数组添加到结果之前检查数组是否为空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2022-01-03
    • 2019-10-14
    • 2016-05-03
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    相关资源
    最近更新 更多