在JavaScript中合并动态对象数组

时间:2019-03-18 16:08:10

标签: javascript arrays object array-merge

我正在尝试使用key:[value array]动态构建对象,但是使用不同的方法,我总是以value数组中的单个项目结束(响应中有多个值)。

伪代码:

var myFunction = function () {
    var myObject = {};
    $.ajax('http://the.url.com', {
        type: "GET",
        success: function (res) {
            $(res).each(function (i, v) {
                    var name = v.name;
                    var id = v.id;
                    // create object with building block and tech id to associate techs to BBs
                    myObject[name] = new Array();
                    myObject[name].push(id);
                });
        },
        error: function (xhr) {}
    }
}

当前输出:

{
    key1: ["value1c"]
    key2: ["value2a"]
    key3: ["value3b"]
}

所需的输出:

{
    key1: ["value1a", "value1b","value1c"]
    key2: ["value2a"]
    key3: ["value3a", "value3b"]
}

4 个答案:

答案 0 :(得分:5)

您要为每个键覆盖一个新的现有数组,然后使用以下行将最新的数组推入其中:

 myObject[name] = new Array();

尝试添加支票以避免覆盖:

 myObject[name] = myObject[name] || new Array();

答案 1 :(得分:2)

我认为您需要在创建新myObject[name]之前检查其是否存在。因为如果您每次创建一个新的,它将被覆盖

var myFunction = function () {
  var myObject = {};
  $.ajax('http://the.url.com', {
    type: "GET",
    success: function (res) {
      $(res).each(function (i, v) {
        var name = v.name;
        var id = v.id;
        // create object with building block and tech id to associate techs to BBs
        if (!myObject[name]) {
          myObject[name] = new Array();
        }
        myObject[name].push(id);
      });
    },
    error: function (xhr) {}
  }
}

答案 2 :(得分:2)

由于对象中的key1: ["value1c"]是唯一的,因此输出为key,因此它正在创建密钥并仅存储最新值。您可以使用hasOwnProperty并检查myObject是否具有该名称的任何密钥。如果是这样,则推送该值,否则创建一个键值对并向其中添加id

$(res).each(function(i, v) {
  var name = v.name;
  var id = v.id;
  if (myObject.hasOwnProperty(name)) {
    myObject[name].push(id);
  } else {
    myObject[name] = [id];
  }
});

答案 3 :(得分:2)

每次使用此行创建另一个数组:

myObject[name] = new Array();

因此您每次都删除旧的推送值。

使用条件初始化数组(如果不存在):

!Array.isArray(myObject[name]) && (myObject[name] = new Array());

例如

$(res).each(function(i, v) {
      var name = v.name;
      var id = v.id;
      // create object with building block and tech id to associate techs to BBs
      !Array.isArray(myObject[name]) && (myObject[name] = new Array()); 
      myObject[name].push(id);
});