다음과 같은 데이터베이스에서 반환되는 개체가 있습니다 : [{id:1},{id:2},{id:3}]
. 첫 번째 배열을 정렬해야하는 순서를 지정하는 다른 배열이 있습니다 (예 : [2,3,1]
).다른 배열에 따라 정렬 순서로 배열 정렬
이 두 배열을 취할 수있는 알고리즘이나 알고리즘을 찾고 있는데 [{id:2},{id:3},{id:1}]
을 반환합니다. 이상적으로 그것은 n 제곱이 아닌 효율적이어야합니다.
다음과 같은 데이터베이스에서 반환되는 개체가 있습니다 : [{id:1},{id:2},{id:3}]
. 첫 번째 배열을 정렬해야하는 순서를 지정하는 다른 배열이 있습니다 (예 : [2,3,1]
).다른 배열에 따라 정렬 순서로 배열 정렬
이 두 배열을 취할 수있는 알고리즘이나 알고리즘을 찾고 있는데 [{id:2},{id:3},{id:1}]
을 반환합니다. 이상적으로 그것은 n 제곱이 아닌 효율적이어야합니다.
당신은 선형 시간을하려는 경우, 먼저 첫 번째 배열에서 해시 테이블을 구축 한 후 두 번째 반복에 의해 순서대로 항목을 선택 :
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))
내 이해를 위해 정렬은 필요하지 않습니다. 적어도 당신의 예제에서 원하는 결과 배열은 다음과 같이 선형 시간으로 생성 될 수 있습니다. 여기
var Result;
for (var i = 0; i < Input.length; i++)
{
Result[i] = Input[Order[i]-1];
}
Result
은 Input
첫 번째 어레이와 Order
원하는 위치를 포함하는 배열 원하는 출력된다.
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]));
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])
};
왜 단지 새로운 배열을 생성하고있는 제 2 어레이로부터 값을 누르지 ?? 내가 당신의 예에서
array1 = [];
array2 = [2,3,1];
for (var i = 0; i < array2 .length; i++)
{
array1.push({
id : array2[i]
})
}
잘못 객체가 처음 작업을 매우 쉽게 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 />');
}
이것은 원래의 배열이 이미'id' 값에 의해 정렬되고 연속적이라고 가정합니다. – Barmar
맞습니다. 그러나 제공된 예제에는 이러한 속성이 모두 포함되어 있으며 위반되었을 수있는 다른 곳에서는 다르게 언급되지 않았습니다. – Codor