按收入对象的顺序构建数组

时间:2014-07-30 13:32:58

标签: javascript arrays

我正在获取XML并解析它,将其保存到数组中,问题是我按此顺序获取对象:

temp1.ID = 15
temp1.name = "Dan"
temp1.phone = "32332"

temp2.ID = 12
temp2.name = "Test"
temp2.phone = 53463

temp3.ID = 2
temp3.name = "Tom"
temp3.phone = 12443
.
.
.
.

Object - 解析XML

时我在循环中得到的对象

我尝试的是按照我开始阅读它们的顺序保存它们:Array: [temp1,temp2,temp3]

但是下一个函数的结果是:Array: [temp3,temp2,temp1]

功能:

    this.mytempect = [];
            for (var i = 0; i < xml.length; i++) {
                var temp = {};
                temp.ID = parseXmlByTag(xml[i], "ID");
                temp.name = parseXmlByTag(xml[i], "name");
                temp.phone = parseXmlByTag(xml[i], "phone");

                  if (this.mytempect [temp .ID] == null) {
                    this.mytempect [temp .ID] = [];
                }
                this.mytempect [temp .ID].push(obj);
}

在我保存每个对象之前,我会检查是否需要为他创建一个新密钥或添加到现有密钥,最后我会得到这样的结果:

我需要保存我收到它们的顺序,所以我会按照我输入的顺序保存它们

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,我认为你应该做的事情。您似乎混淆了对象和数组:mytempect如果要根据ID设置的键存储数组,则需要成为对象。

按照您的示例,具有相同键的对象将按照读取顺序分配给同一个数组(由对象中的该键标识)

// create an object, not an array
this.mytempect = {};
for (var i = 0; i < arr.length; i++) {
  var temp = {};
  temp.ID = arr[i].ID;
  temp.name = arr[i].name;
  temp.phone = arr[i].phone;

  // Don't check for null here because `this.mytempect[temp.ID]` might not exist
  if (!this.mytempect[temp.ID]) {
    this.mytempect[temp.ID] = [];
  }
  this.mytempect[temp.ID].push(temp);
}

DEMO

该演示生成一个对象,其中一个对象位于键15下的数组中,两个位于12下,另一个位于2下:

{
  "2": [
    {
      "ID": 2,
      "name": "Tom",
      "phone": 12443
    }
  ],
  "12": [
    {
      "ID": 12,
      "name": "Test",
      "phone": 53463
    },
    {
      "ID": 12,
      "name": "Test",
      "phone": 53462
    }
  ],
  "15": [
    {
      "ID": 15,
      "name": "Dan",
      "phone": "32332"
    }
  ]
}

注意:您无法以任何方式订购对象。

答案 1 :(得分:0)

也许你正在寻找类似这样的东西

var mytempect = [],
    dict = {},
    i,
    tmp;
for (i = 0; i < xml.length; ++i) {
    tmp = {
        ID: parseXmlByTag(xml[i], "ID"),
        name: parseXmlByTag(xml[i], "name"),
        phone: parseXmlByTag(xml[i], "phone")
    };
    if (!(tmp.ID in dict)) {
        mytempect.push(dict[tmp.ID] = []);
    }
    dict[tmp.ID].push(tmp); // use fact Objects ByRef to add item
}
dict = null; // cleanup

数组 mytempect现在将包含索引012等,其中包含数组所有对象具有相同的 ID 。根据您的样本数据,您将获得

mytempect[0][0].ID === 15;
mytempect[1][0].ID === 12;
mytempect[2][0].ID === 2;