Concat对象无法正常工作,或者我需要将值转换为正确的格式?

时间:2014-11-25 05:55:10

标签: javascript jquery json object

我需要从第一个data.entities.paises获得$.post,从第二个concat()获得data.entities $.post,这就是我正在做的事情:< / p>

  var paisesFromEntity;

  $.post(Routing.generate('productoGuardarPasoCinco'), $form.serialize(), 'json').done(function (data, textStatus, jqXHR) {
    if (data.entities !== "undefined" || data.entities != "") {
      paisesFromEntity = data.entities.paises;
    }
  }).fail(function () {
      return false;
  });

  var returnList = function (entities) {
      if (entities.length > 0) {
          var items = [];
          entities.forEach(function (value, index, array) {
              items.push(value.pais);
          });

          return items.join(', ');
      }
  };

  var fullList = [];

  $.post(Routing.generate('agregarPaisesDistribuidor'), $form.serialize(), 'json').done(function (data, textStatus, jqXHR) {
      fullList = fullList.concat(data.entities, JSON.stringify(paisesFromEntity));
      var displayText = returnList(fullList);
      $('#td-' + data.idToUpdate).html(displayText);
  }).fail(function () {
      return false;
  });

将此输出设为第一个$.post()

{
   "success":true,
   "entities":{
      "id":13,
      "nombre":"dsdsfsdfsd",
      "direccion":"fsdfsdfsdf",
      "telefono":"4234234",
      "paises":[
         "Bolivia",
         "Costa Rica",
         "Ecuador"
      ]
   }
}

这是第二个$.post()

{
   "success":true,
   "entities":[
      {
         "pais":"Colombia"
      },
      {
         "pais":"Panam\u00e1"
      },
      {
         "pais":"Ciudad del Vaticano"
      }
   ],
   "idToUpdate":"14"
}

displayText中的预期输出应该类似于:Bolivia, Costa Rica, Ecuador, Colombia, Panam\u00e1, Ciudad del Vaticano,但我得到的输出是Colombia, Panamá, Ciudad del Vaticano,,而某些值缺少来自data.entities.paises的值。我怀疑错误是data.entities.paises的格式与data.entities的格式不同,因此returnList上的函数不会执行作业上帝,因此{的错误在哪里? {1}}功能还是concat()格式?如果是第二个,如何在连接两者之前将其转换为与data.entities.paises相同的格式?

1 个答案:

答案 0 :(得分:1)

这里有3个问题。

首先,您可以遇到时间问题,因为无法保证第一个$.post将在第二个之前完成。您需要确保在移入之前完成两者。您有几种方法可以做到这一点 - 链接,caolan的异步库https://github.com/caolan/async,检查的回调等等 - 但是这不是你在这里问的问题。

第二个问题是第一个响应是一个字符串数组;第二个是你想要的值的对象数组,你需要将它们组合起来。

第三个问题是你要将字符串数组转换为JSON字符串,这也不会有效。

试试这个。

// assuming data.entities is an array of objects, and paisesFromEntity is an array of strings
fullList = fullList.concat(paisesFromEntity, getValues(data.entities));

getValues()功能

getValues = function(arr){
  var ret = [], i;
  for (i=0; i<arr.length; i++) {
     ret.push(arr[i].pais);
  }
  return(ret);
};

如果你在jQuery中这样做,你可以使用

getValues = function(arr){
  var ret = [];
  $.each(arr,function(i,entry) {
    ret.push(entry.pais);
  });
  return(ret);
};

如果你有权使用lodash或下划线,那么使用pluck会更容易。