2014-12-04 3 views
5

다음과 같은 데이터베이스에서 반환되는 개체가 있습니다 : [{id:1},{id:2},{id:3}]. 첫 번째 배열을 정렬해야하는 순서를 지정하는 다른 배열이 있습니다 (예 : [2,3,1]).다른 배열에 따라 정렬 순서로 배열 정렬

이 두 배열을 취할 수있는 알고리즘이나 알고리즘을 찾고 있는데 [{id:2},{id:3},{id:1}]을 반환합니다. 이상적으로 그것은 n 제곱이 아닌 효율적이어야합니다.

답변

5

당신은 선형 시간을하려는 경우, 먼저 첫 번째 배열에서 해시 테이블을 구축 한 후 두 번째 반복에 의해 순서대로 항목을 선택 :

data = [{id:5},{id:2},{id:9}] 
 
order = [9,5,2] 
 

 
hash = {} 
 
data.forEach(function(x) { hash[x.id] = x }) 
 

 
sorted = order.map(function(x) { return hash[x] }) 
 

 
document.write(JSON.stringify(sorted))

0

내 이해를 위해 정렬은 필요하지 않습니다. 적어도 당신의 예제에서 원하는 결과 배열은 다음과 같이 선형 시간으로 생성 될 수 있습니다. 여기

var Result; 
for (var i = 0; i < Input.length; i++) 
{ 
    Result[i] = Input[Order[i]-1]; 
} 

ResultInput 첫 번째 어레이와 Order 원하는 위치를 포함하는 배열 원하는 출력된다.

+0

이것은 원래의 배열이 이미'id' 값에 의해 정렬되고 연속적이라고 가정합니다. – Barmar

+0

맞습니다. 그러나 제공된 예제에는 이러한 속성이 모두 포함되어 있으며 위반되었을 수있는 다른 곳에서는 다르게 언급되지 않았습니다. – Codor

2

function sortArrayByOrderArray(arr, orderArray) { 
 
     return arr.sort(function(e1, e2) { 
 
      return orderArray.indexOf(e1.id) - orderArray.indexOf(e2.id); 
 
     }); 
 
    } 
 

 
    console.log(sortArrayByOrderArray([{id:1},{id:2},{id:3}], [2,3,1]));

0
var objArray = [{id:1},{id:2},{id:3}]; 
var sortOrder = [2,3,1]; 

var newObjArray = []; 
for (i in sortOrder) { 
    newObjArray.push(objArray[(sortOrder[i]) - 1]) 
}; 
+0

아니요, 올바르지 않습니다. –

+0

이 문제는 무엇이 잘못 되었습니까? –

+0

obj 배열을 정렬 할 수 없습니다. sortorder – Alexis

0

왜 단지 새로운 배열을 생성하고있는 제 2 어레이로부터 값을 누르지 ?? 내가 당신의 예에서

array1 = []; 
array2 = [2,3,1]; 

for (var i = 0; i < array2 .length; i++) 
{ 
    array1.push({ 
     id : array2[i] 
    }) 
} 
1

잘못 객체가 처음 작업을 매우 쉽게 id,으로 분류되어있는 경우 정정 해줘. 그러나 이것이 일반적으로 사실이 아니라면 배열의 id 값에 따라 선형 시간대로 개체를 정렬 할 수 있습니다.

아이디어는 각각의 id 값을 해당 위치로 매핑 한 다음 인덱스에서 id 값을 찾아 원하는 위치에 각 개체를 삽입하는 인덱스를 만드는 것입니다. 이를 위해서는 길이가 n 인 두 개의 배열을 반복해야하므로 전체 실행 시간은 O(n) 또는 선형 시간이됩니다. 입력 배열을 읽는 데 단지 선형 시간이 걸리기 때문에 점차적으로 빠른 런타임이 없습니다.

function objectsSortedBy(objects, keyName, sortedKeys) { 
 
    var n = objects.length, 
 
     index = new Array(n); 
 
    for (var i = 0; i < n; ++i) { // Get the position of each sorted key. 
 
    index[sortedKeys[i]] = i; 
 
    } 
 
    var sorted = new Array(n); 
 
    for (var i = 0; i < n; ++i) { // Look up each object key in the index. 
 
    sorted[index[objects[i][keyName]]] = objects[i]; 
 
    } 
 
    return sorted; 
 
} 
 

 
var objects = [{id: 'Tweety', animal: 'bird'}, 
 
       {id: 'Mickey', animal: 'mouse'}, 
 
       {id: 'Sylvester', animal: 'cat'}], 
 
    sortedIds = ['Tweety', 'Mickey', 'Sylvester']; 
 

 
var sortedObjects = objectsSortedBy(objects, 'id', sortedIds); 
 

 
// Check the result. 
 
for (var i = 0; i < sortedObjects.length; ++i) { 
 
    document.write('id: '+sortedObjects[i].id+', animal: '+sortedObjects[i].animal+'<br />'); 
 
}

관련 문제