Javascript 개체를 정렬하거나 배열로 변환하려면 어떻게 해야 합니까?
서버로부터 취득한 JSON 데이터가 있습니다.내 JavaScript에서 몇 가지 정렬을 하고 싶다.sort() 함수는 내가 원하는 대로 할 수 있을 것 같아.
그러나 JavaScript는 도착 즉시 JSON 데이터를 객체로 변환하는 것으로 보입니다.sort() 메서드를 사용하려고 하면 오류가 많이 발생합니다(테스트에 Firebug 사용).
인터넷을 살펴보니 JSON 오브젝트는 이미 JavaScript 어레이이며 오브젝트는 어레이와 동일하게 취급할 수 있다고 모두가 말하는 것 같습니다.이 질문에서처럼, 한 남자가 대답에서 "[객체]는 여러분의 데이터입니다. 어레이처럼 액세스할 수 있습니다."라고 말합니다.
하지만, 그것은 정확히 사실이 아니다.JavaScript에서 오브젝트에 sort()를 사용할 수 없습니다.기본적으로는 모두 같은 것으로 간주되기 때문에 오브젝트를 어레이로 변환하는 방법이나 JavaScript가 오브젝트를 하나의 것으로 취급하도록 강제하는 방법에 대한 지침은 어디에도 없는 것 같습니다.
그러면 이 데이터를 배열로 취급하여 정렬()할 수 있도록 자바스크립트를 얻는 방법은 무엇일까요?
내 개체의 콘솔 로그 출력은 다음과 같습니다('레벨'의 값을 기준으로 정렬할 수 있어야 합니다).
오브젝트 JSON 데이터
{
1: {
displayName: "Dude1",
email: "dude1@example.com<mailto:dude1@example.com>",
lastActive: 1296980700,
level: 57,
timeout: 12969932837
}, 2: {
displayName: "Dude2",
email: "dude2@example.com<mailto:dude2@example.com>",
lastActive: 1296983456,
level: 28,
timeout: 12969937382
}, 3: {
displayName: "Dude3",
email: "dude3@example.com<mailto:dude3@example.com>",
lastActive: 1296980749,
level: 99,
timeout: 129699323459
}
}
Array.prototype.slice.call(arrayLikeObject)
는 어레이와 같은 오브젝트를 어레이로 변환하는 표준 방법입니다.
은 실제로 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★arguments
물건.범용 오브젝트를 어레이로 변환하는 것은 조금 귀찮습니다.다음은 Underscore.js의 소스입니다.
_.toArray = function(iterable) {
if (!iterable) return [];
if (iterable.toArray) return iterable.toArray();
if (_.isArray(iterable)) return iterable;
if (_.isArguments(iterable)) return slice.call(iterable);
return _.values(iterable);
};
_.values = function(obj) {
return _.map(obj, _.identity);
};
오브젝트를 루프하여 어레이에 직접 매핑해야 합니다.
var newArray = []
for (var key in object) {
newArray.push(key);
}
어레이와 "어소시에이션 어레이"의 개념을 혼동하고 있습니다.JavaScript 형식의 수 .이는 사용자가 포맷으로 데이터에 액세스할 수 있기 때문입니다.object["key"]
오브젝트는 순서가 매겨지지 않은 목록이기 때문에 실제 연관 배열이 아닙니다.
오브젝트와 어레이는 크게 다릅니다.
밑줄 사용 예:
var sortedObject = _.sortBy(object, function(val, key, object) {
// return an number to index it by. then it is sorted from smallest to largest number
return val;
});
실제 예 참조
JavaScript 개체를 다음과 같은 배열로 변환할 수 있습니다.
var obj = {
'1': 'a',
'2': 'b',
'3': 'c'
};
var arr = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
arr.push(obj[key]);
}
}
console.log(arr); // ["a", "b", "c"]
JavaScript 객체가 배열과 유사한 객체인 경우, 즉 유효한 수치를 가진 객체인스턴스length
속성으로 많은 네이티브 어레이 메서드를 직접 사용할 수 있습니다.call
를 들어 다음과 같습니다예를 들어 다음과 같습니다.
// Sorts the given objet in-place as if it was an array
Array.prototype.sort.call(yourObject);
따라서 정렬할 항목 수(JavaScript에서 개체의 키 수/속성 수를 효율적으로 계산하는 방법)를 알고 있다면 다음을 수행할 수 있습니다.
yourObject.length = theNumberOfEntries;
Array.prototype.sort.call(yourObject);
// Optionally: delete yourObject.length;
" " " "..."로만 "0", "1", "2", ...로됩니다.로 인덱싱된 속성만 정렬됩니다.length - 1
츠키노개체의 다른 속성은 정렬되지 않습니다.
이러한 답변의 대부분은 문제를 지나치게 복잡하게 만들거나 JQuery 또는 언더스코어를 사용하는 반면 OP에서는 이러한 답변을 요구하지 않습니다.
개체를 다음과 같이 배열로 변환할 수 있습니다.
myArray= Object.keys(data).map(function(key) { return data[key] });
결과를 다음과 같이 정렬합니다.
myArray.sort(function(x, y) {return x.level - y.level});
ID/인덱스가 필요한 경우 다음 작업을 수행해야 합니다.
Object.keys(data).map(function(key) {
var obj = data[key];
obj.index = key;
return obj
});
최근에 속성별로 오브젝트 배열을 그룹화하려다 우연히 이 문제를 발견하여 정렬할 수 없는 오브젝트가 하나 생겼습니다.
구체적으로는 연도별로 그룹화하여 내림차순으로 정렬하고 싶은 블로그 투고입니다.언더스코어 유틸리티를 사용했습니다.
var grouped = _.groupBy(blogposts, function(post){
var date = new Date(post.publication_date)
return date.getFullYear()
})
//=> { 2010: [blogpost, blogpost,etc], 2011: [blogpost, etc] }
@Raynos가 설명했듯이 정렬하기 전에 먼저 어떤 배열이 필요했습니다.
(1.4)음음음음음음음음음음 called called called called called called called called called called called called called called called called called called called called called라고 불리는 작은 것으로 .pairs
[key, value] 키 {key: value} 키(값)로 하다.합니다.
var paired = _.map(grouped, function(val, key){
return [key, val]
})
//=> [ [2010, [blogpost, blogpost, ...] ], [2011, [blogpost, blogpost, ...]]...]
여기서부터는 각 쌍의 첫 번째 항에 따라 쉽게 정렬할 수 있습니다.
최종 결과는 다음과 같습니다.
var grouped = _.groupBy(result.resource, function(resource){
var date = new Date(resource.pub_date)
return date.getFullYear() //+ "." + (date.getMonth()+1)
})
var paired = _.pairs(grouped)
var sorted = _.sortBy(paired, function(pairs){
return -parseInt(pairs[0])
})
return sorted;
// Giving me the expected result:
//=> [ [2013, [blogpost, blogpost, ...] ], [2012, [blogpost, blogpost, ...]]...]
더 나은 방법이 있을 거라고 확신하지만, 루비에서 나오는 이 코드는 바로 이해할 수 있습니다.
jQuery는 배열 또는 객체의 각 요소를 반복하여 결과를 새 배열로 매핑하는 맵 기능을 제공합니다.
jQuery 1.6 이전 버전에서는 $.map()은 어레이 통과만 지원했습니다.
이를 사용하여 다음과 같이 개체를 배열로 변환할 수 있습니다.
myArray = $.map(myObject, function (el) {
return el;
});
그러나... 콜백 함수가 null 또는 defined를 반환할 경우 해당 값은 어레이에서 삭제됩니다.대부분의 경우 도움이 되지만 myArray에 null 값이 필요한 경우 문제가 발생할 수 있습니다.
jQuery는 이에 대한 솔루션을 제공합니다.값을 단일 값을 가진 배열로 반환
myArrayWithNulls = jQuery.map(myObject, function (el) {
return [el];
});
다음은 두 가지 접근방식을 보여 주는 바이올린입니다.http://jsfiddle.net/chim/nFyPE/
http://jsperf.com/object-to-array-jquery-2
오브젝트일 수 있는 속성을 가진 오브젝트를 다차원 배열로 재귀적으로 변환하는 작은 함수를 작성했습니다.이 코드는 Each 메서드 및 toArray 메서드의 밑줄 또는 lodash에 따라 달라집니다.
function deepToArray(obj) {
var copy = [];
var i = 0;
if (obj.constructor == Object ||
obj.constructor == Array) {
_.forEach(obj, process);
} else {
copy = obj;
}
function process(current, index, collection) {
var processed = null;
if (current.constructor != Object &&
current.constructor != Array) {
processed = current;
} else {
processed = deepToArray(_.toArray(current));
}
copy.push(processed);
}
return copy;
}
다음은 바이올린입니다.http://jsfiddle.net/gGT2D/
주의: 이것은 원래 어레이였던 개체를 어레이로 변환하기 위해 작성되었습니다.따라서 어레이 이외의 인덱스 키 값은 모두 손실됩니다.
언급URL : https://stackoverflow.com/questions/4929924/how-to-sort-a-javascript-object-or-convert-it-to-an-array
'programing' 카테고리의 다른 글
JSON에 대한 JavaScript 관련 배열 (0) | 2023.04.04 |
---|---|
오라올레디비로컬 시스템에 Oracle 제공자가 등록되어 있지 않습니다. (0) | 2023.04.04 |
Oracle에서 with 절을 사용하여 테이블 생성 (0) | 2023.04.04 |
최소화된 각도 javascript에서 알 수 없는 제공자를 디버깅하고 있습니다. (0) | 2023.04.04 |
스크립트 실행 중에 AJAX 콜이 반환되면 JavaScript는 어떻게 됩니까? (0) | 2023.04.04 |