在javascript中合并动态对象数组

问题描述 投票:1回答:4

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

伪代码:

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"]
}
javascript arrays object array-merge
4个回答
5
投票

您将使用每个键的新数组覆盖现有数组,然后使用以下行推送最新的数组:

 myObject[name] = new Array();

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

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

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];
  }
});

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
投票

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

myObject[name] = new Array();

所以你每次都删除旧的推送值。

如果不存在,请使用条件初始化数组:

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

EG

$(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);
});
© www.soinside.com 2019 - 2024. All rights reserved.