JS对象和数组的选择和操作

时间:2016-06-07 00:43:45

标签: jquery arrays ajax

当我获得ajax数据时,它是一个数组:

[
  {"ID"  :"1",
   "Last":"SMITH",
  },
  {"ID"  :"2",
   "Last":"DOE",
  },
] 

我正在尝试将其保存到另一个数组变量中,以便可以添加更多的ajax数据以供将来使用:

var arr = [];
arr.push(ajax_data);

但是,ajax数组被添加到另一个数组中:

[
 [
  {"ID"  :"1",
   "Last":"SMITH",
  },
  {"ID"  :"2",
   "Last":"DOE",
  },
 ]
] 

所以这是我的问题:

  1. 你们有什么建议,以便只有一个阵列有多个ajax数组添加?换句话说,我如何删除额外的[]语法?
  2. 每个对象都有多个键。我想使用" ID"作为查找要使用的对象的主键。如何搜索并选择正确的对象?
  3. FOR INDEXING:

    下面是我将要使用的一般数组结构,其中IDpost_id作为两个键,但可以有其他键(为此演示复制和粘贴值)。对象数量最多可达100个。

    这是ajax数据,将concat放入数组中。

    enter image description here

    正如@jfriend00指出的那样,按ID索引它可能效率低下。通过ID索引大型数组的好方法是什么?

3 个答案:

答案 0 :(得分:2)

如果使用ID作为键将数据保存在对象中,则可以解决这两个问题。将变量初始化为空对象:

var saved_data = {};

然后在你的AJAX回调函数中添加新对象:

ajax_data.forEach(function(object) {
    saved_data[object.ID] = object;
});

现在您可以使用saved_data["1"].Last来访问特定对象。

答案 1 :(得分:1)

  

你们有什么建议,以便只有一个阵列添加多个ajax阵列?换句话说,我如何删除extra []语法?

您需要使用concat()代替push()

concat创建一个新数组,该数组由调用它的对象中的元素组成,依次为每个参数,该参数的元素(如果参数是数组)或参数本身(如果参数不是数组)。

var array1 = [
  {"ID"  :"1",
   "Last":"SMITH",
  },
  {"ID"  :"2",
   "Last":"DOE",
  },
];

var newArray = array1.concat(array2);
  

每个对象都有多个键。我想使用“ID”作为主键来查找要使用的对象。如何搜索并选择正确的对象?

如果您想根据ID检索:

var found;
var ID = "2";
newArray.some(function (obj) {
  if (obj.ID === ID) {
    found = obj;
    return true;
  }
});

found将是:Object {ID: "4", Last: "DOE"}

答案 2 :(得分:1)

  

你们有什么建议,这样只有一个阵列有多个   ajax数组加?换句话说,我如何删除extra []语法?

您需要使用向数组添加多个元素的方法之一,而不是添加数组本身(请参阅下面的选项)。

要添加到现有阵列,您可以使用.push().splice()。您也可以使用.concat(),但它返回一个新数组,您必须将其分配回前一个变量:

var arr = [];

var newData = [
  {"ID"  :"1",
   "Last":"SMITH",
  },
  {"ID"  :"2",
   "Last":"DOE",
  },
];

// add newData onto arr using .push()
arr.push.apply(arr, newData);

// add newData onto arr using .concat()
// remember that .concat() returns a new array
arr = arr.concat(newData);

使用.splice()需要更多参与,如果您尝试替换元素,则可能只会这样做。

  // put first two `.splice()` arguments onto front of the array
  newData.unshift(arr.length, 0);
  arr.splice.apply(arr, newData);
  

每个对象都有多个键。我想用“ID”作为主要的   找到要使用的对象的关键。我如何搜索并选择   正确的对象?

如果您希望能够按ID索引,那么数组不是一个非常有效的结构。您必须搜索数组中的每个对象以查找具有匹配ID的对象。您可以按ID创建单独的索引,也可以更改存储数据的方式。如何更改存储数据的方式取决于您需要如何访问数据,是否存在具有相同键的多个对象,对象是否具有多个键等等...您必须指定更多详细信息关于你需要我们提出一个好的建议。

只需100个条目,您就可以轻松进行暴力搜索:

function findById(array, id) {
    for (var i = 0; i < array.length; i++) {
        if (array[i].ID === id) {
            return array[i];
        }
    }
    return null;
}

如果你想索引它们并且所有ID都是唯一的并且顺序不相关,那么只需存储在一个对象中而不是数组:

 var data = {};

 // add new data to our storage
 newData.forEach(function(item) {
     data[item.ID] = item;
 });

然后,按ID访问:

 var item = data[id];

在ES6中(或通过转换或使用polyfill),您还可以使用Map对象。

 var data = new Map();

 // add new data to our storage
 newData.forEach(function(item) {
     data.set(item.ID, item);
 });

然后,按ID访问:

 var item = data.get(id);

Map对象优于使用常规JS对象的一个​​优点是您的id可以是任何数据类型(包括另一个对象)。使用普通的JS对象时,必须将其强制转换为唯一的字符串。