Слияние массивов динамических объектов в JavaScript - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь динамически построить объект с ключом: [массив значений], однако, используя разные методы, я получаю отдельный элемент в массиве значений (где в ответе есть несколько значений).

Psuedocode:

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 ]

5 голосов
/ 18 марта 2019

Вы перезаписываете существующий массив новым для каждого ключа, а затем добавляете последний со следующей строкой:

 myObject[name] = new Array();

Попробуйте добавить проверку, чтобы избежать перезаписи:

 myObject[name] = myObject[name] || new Array();
2 голосов
/ 18 марта 2019

Вы каждый раз создаете новый массив с этой строкой:

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);
});
2 голосов
/ 18 марта 2019

Выходное значение равно 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 голосов
/ 18 марта 2019

Я думаю, что вам нужно проверить, существует ли 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) {}
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...