JavaScript在索引处插入到Array中

时间:2013-11-22 13:25:01

标签: javascript arrays node.js

我知道当索引已经存在时如何在索引处插入数组。说arr = [1, 2, 3, 4]arr.splice(2, 0, 0)会产生[1, 2, 0, 3, 4]。但是我有一个空数组,它从一个没有任何特定顺序的对象中填充。实际上,数组用于对对象进行排序:

var key  = parseInt(object[object_key].timestamp);
while (key && array_sorted[key]) { //Attempt at preventing overwriting elements with same timestamp
    key++;
}
key = key ? key : array_sorted.length + 1;
array_sorted.splice(key, 0, object[object_key].data);

现在这将构建一个数组[object[0].timestamp, object[1].timestamp, object[2].timestamp, ...]而不是像[undefined, ..., undefined, object[4].timestamp, object[3].timestamp, undefined, object[0].timestamp, undefined, ..., undefined, object[1].timestamp]这样的东西...我怎么能用timestamp(对象的对象的属性)来实现对象对象的排序方法?有没有办法在空数组的索引处插入?

3 个答案:

答案 0 :(得分:1)

我不会具体说明,但下面给出的例子可以帮助您解决问题。

我们说

var objArray=[{"Name":"Anand"},{"Name":"Jhon"},{"Name":"Paul"}];

现在你可以像

那样排序
objArray.sort(function(a, b) {

         var textA = a.Name.toUpperCase();
         var textB = b.Name.toUpperCase():;

         return (textA < textB) ? 1 : (textA > textB) ? -1 : 0;
         //return (textA < textB) ? -1 : (textA > textB) ? 1 : 0; //for ascending.

  });

现在您将找到已排序的数组。

答案 1 :(得分:1)

不确定我是否正确理解了您的问题。实际上我可以看到几个问题,我会尝试回答它们:

排序对象

您无法对对象进行排序,但您可以创建一个包含对象属性键的数组或按某些条件排序的值。

var object = {
  a: {
    timestamp: 1385127590866
  },
  c: {
    timestamp: 1385127590872
  },
  b: {
    timestamp: 1385127590877
  }
},

keys = Object.keys(object), // Get object properties as array

sortedByKeys = keys.sort(function(key0, key1) { // ['a', 'b', 'c']
    if(key0 < key1) return -1;
    if(key1 > key0) return 1;
    return 0;
}),

sortedByTimestamp = keys.sort(function(key0, key1) { // ['a', 'c', 'b']
    return object[key1] - object[key0];
}),

sortedValues = [], i, j;
for(i=0, l=sortedByTimestamp.length; i<l; i++) { // [{timestamp:1385127590866}, {timestamp:1385127590872}, {timestamp:1385127590877}]
    sortedValues.push(object[sortedByTimestamp[i]]);
}

在特定索引

创建空数组的地方项目
var array = Array(Object.keys().length); // [undefined, undefined, undefined]
array[1] = object['a']; // [undefined, {timestamp:1385127590866}, undefined]

希望它会有所帮助。

答案 2 :(得分:1)

要回答实际问题,Javascript中的对象不保证任何订单。

要从object of objects获取您想要的基于订单的行为,您确实需要将其转换为array of objects。然后,您可以根据Anand的建议使用sort方法对其进行排序。

或者你可以随意排序:

var objects = {
  1:{timestamp:"12345"},
  2:{timestamp:"34567"},
  3:{timestamp:"23456"}
}

var array = [];

for(var i in objects){

  var timestamp = parseInt(objects[i].timestamp);

  var added = false;

  for(var j in array){

    if(timestamp > parseInt(array[j].timestamp)){

      array.splice(j + 1, 0, objects[i]);

      added = true;

      break;

    }
  }

  if (!added) {

    array.unshift(objects[i]);

  }
}