2013-11-22 3 views
0

Я знаю, как вставлять в массив по индексу, когда этот индекс уже присутствует. Скажем arr = [1, 2, 3, 4] и arr.splice(2, 0, 0) приведет к [1, 2, 0, 3, 4]. Однако у меня есть пустой массив, который заполняется из объекта, который не находится в каком-либо конкретном порядке. На самом деле массив используется для сортировки объекта:Вставка JavaScript в массив по индексу

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 (свойство объекта объекта) с использованием Этот метод? Есть ли способ вставить в индекс пустого массива?

+0

'вар а = []; a.splice (2, 0, 'test'); 'работает, если вы хотите вставить в начале массива или индекса 2. В противном случае не будет' a [2] = 'test'' работать для вас – megawac

+0

@megawac 'a.length' возвращает ** 1 ** вместо 3 a [2] создаст объект с пустым массивом и элементом с ключом« 2 »... – Xeos

+0

пытаются индексировать их с меткой времени в качестве ключа? Поскольку ваше свойство 'array_sorted.length' (подается на ключ, когда ключ не проверяется) может переопределять потенциальные ключи ... – shennan

ответ

1

Чтобы ответить на реальный вопрос, объекты в Javascript не гарантируют никакого заказа.

Чтобы получить такое поведение на основе порядка, которое вы хотите получить от своего object of objects, вам действительно нужно преобразовать его в array of objects. Затем вы можете отсортировать его с помощью метода 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]); 

    } 
} 
+0

Точно! Благодарю. Я добавил чек 'добавлен', который будет следить за тем, что если все ключи больше, чем те, которые будут добавлены, он все равно будет вставлен. – Xeos

+0

@Xeos, когда вы добавляли это редактирование, я также замечал ошибку и записывал ее. Я даже использовал то же имя переменной 'добавлено' :-). Дальше отредактировали, поскольку нам больше не нужна проверка длины переменной. Если элемент не был добавлен, это поймает его. Кроме того, использование 'unshift' кажется более элегантным. – shennan

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. 

    }); 

теперь вы найдете отсортированный массив.

+0

OP говорит, что это не массив объектов, а объект объектов ... – shennan

+1

Я просто объясняю какой-то логический подход, а не конкретную проблему. – anand4tech

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] 

Надеется, что это поможет.

Смежные вопросы