【问题标题】:json wihin multiple loop issue on basis of id基于id的多循环问题的json
【发布时间】:2019-09-17 04:35:36
【问题描述】:

我正在从第三方 API 获取数据。

从第一个循环开始,我得到了所有的预订数据。在一个循环中,我想获取每个预订 ID 的预订详细信息。

但是当我尝试创建一个数组并尝试推入 JSON 时。它正在循环预订详细信息的长度并与主循环相乘并将整个数据获取到最后创建的 JSON。

但我只需要每个 id 的预订 id 数据,而不是最后一个预订 id 的全部数据。

你能帮我解决这个问题吗?

这是我的脚本:

jQuery.each(bookings, function(index, val) {

  var bookingDetails = client.getBookingDetails(bookings[index].id);

  jQuery.each(bookingDetails.additional_fields, function(i, fields) {
    var id = fields.field_id;
    var value = fields.value;
    arr.push({
      id,
      value
    });
    xy = JSON.stringify(arr);
  });

  dataItems += '{"booking_id"' + ": " + bookings[index].id + "," + '"booking_service"' + ": " + '"' + bookings[index].event + '"' + "," + '"booking_area"' + ": " + '"' + bookings[index].unit + '"' + "," + '"booking_stid"' + ": " + '"' + bookings[index].code + '"' + "," + '"booking_scid"' + ": " + '" "' + "," + '"booking_day"' + ": " + '"' + lesson_day + '"' + "," + '"booking_time"' + ": " + '"' + lesson_time + '"' + "," + '"booking_tname"' + ": " + '" "' + "," + '"booking_tgname"' + ": " + '" "' + "," + '"booking_bookdate"' + ": " + '"' + lesson_day + '"' + "," + '"booking_rpid"' + ": " + '" "' + "," + '"booking_rpaddress"' + ": " + '" "' + "," + '"booking_sub"' + ": " + '" "' + "," + '"booking_pcode"' + ": " + '" "' + "," + '"booking_wphone"' + ": " + '" "' + "," + '"booking_mphone"' + ": " + '" "' + "," + '"booking_mail"' + ": " + '" "' + "," + '"booking_state"' + ": " + '"  "' + "," + '"booking_gender"' + ": " + '" "' + "," + '"booking_dob"' + ": " + '" "' + "," + '"additional_fields"' + ": " + xy + "},";
});

apidata = dataItems;
apidata = dataItems.substring(0, dataItems.length - 1);
apidata = "[" + apidata + "]";
});

【问题讨论】:

  • 能分享一下你正在处理的json结构吗?
  • JSON 数据较大,您可以在这里查看:jsfiddle.net/nisha18/vzotdpxL/2
  • 您追求哪些领域? booking_id 和 b_id?
  • b_id 与 booking_id 相同。
  • 不清楚你在追求什么,如果你能解释一下解析JSON后你需要什么,那么人们可以帮助你更多。

标签: javascript jquery json multidimensional-array


【解决方案1】:

您可以重构代码,使用forEach 迭代数组并使用backticks 创建多行字符串。

这里的错误可能是使用索引变量来获取additional_fields。请在下面找到重构的代码。

(function($) {
  var JSONRpcClientException = function(code, message) {
    this.code = code;
    this.message = message;
  }

  JSONRpcClientException.prototype = jQuery.extend(JSONRpcClientException.prototype, {

    /**
     * Magic method. COnvert object to string.
     * 
     * @return String
     */
    toString: function() {
      return '[' + this.code + '] ' + this.message;
    }
  });

  /**
   * JSON-RPC Client
   * 
   * @param Object options
   */
  var JSONRpcClient = function(options) {
    this.setOptions(options);
    this.init();
  }
  JSONRpcClient.prototype = jQuery.extend(JSONRpcClient.prototype, {

    /**
     * Default options
     */
    options: {
      'onerror': function() {},
      'onsuccess': function() {},
      'url': '',
      'headers': {}
    },
    current: 1,
    onerror: null,
    onsuccess: null,
    onstart: null,

    /**
     * Init client
     */
    init: function() {
      this.onerror = this.getParam('onerror');
      this.onsuccess = this.getParam('onsuccess');

      this.initMethods();
    },

    /**
     * Init API methiods by url
     */
    initMethods: function() {
      var instance = this;
      // get all methods
      jQuery.ajax(this.getParam('url'), {
        'async': false,
        'success': function(data) {
          if (data.methods) {
            // create method
            jQuery.each(data.methods, function(methodName, methodParams) {
              var method = function() {
                var params = new Array();
                for (var i = 0; i < arguments.length; i++) {
                  params.push(arguments[i]);
                }
                var id = (instance.current++);
                var callback = params[params.length - 1];
                var request = {
                  jsonrpc: '2.0',
                  method: methodName,
                  params: params,
                  id: id
                };

                var async = false;
                if (jQuery.type(callback) == 'function') {
                  async = true;
                  params.pop();
                }

                var res = null;
                // API request
                jQuery.ajax(instance.getParam('url'), {
                  'contentType': 'application/json',
                  'type': methodParams.transport,
                  'processData': false,
                  'dataType': 'json',
                  'cache': false,
                  'data': JSON.stringify(request),
                  'headers': instance.getParam('headers'),
                  'async': async,
                  'success': function(result) {
                    if (jQuery.type(result.error) == 'object') {
                      res = new JSONRpcClientException(result.error.code, result.error.message);
                      instance.onerror(res);
                    } else {
                      res = result.result;
                      if (jQuery.type(callback) == 'function') {
                        callback(res);
                      }
                    }
                    instance.onsuccess(res, id, methodName);
                  }
                });
                if (!async) {
                  return res;
                }
              }

              instance[methodName] = method;
            });
          } else {
            throw Exception("Methods could not be found");
          }
        }
      });
    },

    /**
     * Set client options
     * 
     * @param Object options
     */
    setOptions: function(options) {
      this.options = jQuery.extend({}, this.options, options);
    },

    /**
     * Get client param, if param is not available in this.options return defaultValue
     * 
     * @param String key
     * @param mixed defaultValue
     * @return mixed
     */
    getParam: function(key, defaultValue) {
      if (jQuery.type(this.options[key]) != 'undefined') {
        return this.options[key];
      }
      return defaultValue;
    }

  });

  var loginClient = new JSONRpcClient({
    'url': 'https://user-api.simplybook.me' + '/login',
    'onerror': function(error) {},
  });
  var token = loginClient.getUserToken("skateclub", "admin", "TonyHawk");
  var company_login = "skateclub";

  client = new JSONRpcClient({
    'url': 'https://user-api.simplybook.me' + '/admin/',
    'headers': {
      'X-Company-Login': company_login,
      'X-User-Token': token
    },
    'onerror': function(error) {}
  });

  //var bookings = client.getBookings({"date_from":"2015-01-01"});
  //var bookings = client.getBookingsZapier(10);
  var bookings = client.getBookings({
    "date_from": "2019-09-10",
    "date_to": "2019-09-13"
  });

  jQuery(document).ready(function() {
    var inc = 0,
      bx = 0;
    var dataItems = "";
    var bookItems = "";
    var bookData = "";
    var apidata = "";
    var newBookData = "";
    var arr = [];
    var xy = [];
    var z = "";

    bookings.forEach(bookingDetails => {
      additional_fields = client.getBookingDetails(bookingDetails.id).additional_fields;
      /* Lesson Date Time */
      var DayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
      var start_date = new Date(bookings.start_date);
      var lesson_day = DayNames[start_date.getDay()];
      var cHour = start_date.getHours();
      var cMin = start_date.getMinutes();

      if (cMin < 10)
        cMin = "0" + cMin;

      var suffix = "AM";
      if (cHour >= 12) {
        suffix = "PM";
        cHour = cHour - 12;
      }
      if (cHour == 0) {
        cHour = 12;
      }
      var lesson_time = cHour + ":" + cMin + " " + suffix;
      xy = [];
      additional_fields.forEach(item => {
        xy.push({
          b_id: bookingDetails.id,
          field_id: item.field_id,
          value: item.value
        });
      });
      dataItems += `'booking_id : ${bookingDetails.id}, additional_fields : ${JSON.stringify(xy)}`;
    });
    apidata = dataItems;
    apidata = dataItems.substring(0, dataItems.length - 1);
    apidata = "[" + apidata + "]";
    console.log(apidata);
  });


})(jQuery);
&lt;script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"&gt;&lt;/script&gt;

【讨论】:

  • 请在答案本身中包含答案的所有相关代码。
  • @JonP 已编辑,但这本可以作为评论而不是投反对票。
猜你喜欢
  • 2018-05-11
  • 2020-09-17
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多