2012-04-09 38 views
5

Tôi có một đối tượng javascript với hai mảng như hiển thị,loại javascript mảng trong đối tượng, duy trì trọng

var Object = {'name': [Matt, Tom, Mike...], 'rank': [34,1,17...]}; 

tôi đang cố gắng để sắp xếp theo thứ hạng 1,2,3 .. nhưng giữ nguyên tên gắn liền với cấp.

Object.name[0] // tom 
Object.rank[0] // tom's rank of 1. 

Tôi có nên định cấu hình lại đối tượng để sắp xếp dễ dàng hơn không?

Tôi hiện đang sử dụng

Object.rank.sort(function(a,b){return a-b}); 

để đặt hàng cấp bậc, nhưng tên không ở lại với nó.

Tất cả trợ giúp đều được đánh giá cao. Cảm ơn!

+1

Tốt hơn để thay đổi đối tượng của bạn để giữ dữ liệu trong một định dạng khác nhau và đối tượng là một tên biến xấu. – epascarello

+3

'var Object = {....' thực sự? – Mohsen

+0

Đối tượng của tôi không được đặt tên đối tượng .. Tôi chỉ nghĩ rằng nó sẽ đơn giản hơn ... đoán không .. – mattyd

Trả lời

4

Có, cấu hình lại.Giả sử bạn đã có này để thay thế:

var people = [{name:"Matt", rank:34}, {name:"Tom", rank:1}, {name:"Mike", rank:17}]; 

Sau đó, bạn có thể sắp xếp như thế này:

people.sort(function(a, b) { 
    return a.rank - b.rank; 
} 

Sửa

Vì bạn có danh sách song song, chỉ cần nén chúng lại với nhau:

var people = []; 
for (var i = 0; i < Object.name.length; i++) { 
    people.push({name:Object.name[i], rank:Object.rank[i]}); 
} 
+0

cảm ơn! Tôi biết phải có một cách trực quan hơn về điều này. – mattyd

+0

như vậy. Tôi có đối tượng con người của tôi khi bạn hiển thị. [{name: val}, {name: val}], Nhưng tôi đang đấu tranh để cảnh báo (people.name [0]) và cũng là var của tôi, trong khi tạo ra với chức năng, và với một async: POST sai, có thể không được sử dụng bên ngoài mã ... Bất kỳ ý tưởng? – mattyd

+1

Điều đó thực sự sẽ là 'người [0] .name'. – jpsimons

0

Bạn sẽ phải viết chức năng sắp xếp của riêng bạn cho mỗi thao tác sắp xếp, ghi nhớ chỉ mục nào đến nơi trong mỗi lần lặp trong mảng xếp hạng. Thực hiện thao tác tương tự từ chỉ mục nguồn đến chỉ mục đích trong mảng tên. (chỉnh sửa) Một algortihm cho điều này từ đỉnh đầu của tôi là bong bóng, nhìn nó lên.

Tùy chọn khác là tìm kiếm một số loại triển khai thu thập "bản đồ".

1

Vâng, vâng, nếu đối tượng thứ i trong mảng names được kết nối với đối tượng thứ i trong mảng rank, bạn nên biểu thị nó theo cách đó. Điều này có nghĩa, bạn nên sử dụng một đối tượng Person (hoặc bất kể nó là gì) với hai thuộc tính: namerank.

// person constructor 
function Person(name, rank) { 
    this.name = name; 
    this.rank = rank; 
} 

// create the object with the array 
var myObject = { 
    myArray: new Array() 
}; 

// populate the array 
myObject.myArray.push(new Person('Matt', 34)); 
myObject.myArray.push(new Person('Tom', 1)); 
myObject.myArray.push(new Person('Mike', 17)); 

// sort the Person objects according to their ranks 
myObject.myArray.sort(function(a, b) { 
    return b.rank - a.rank;  
}); 
+0

Tuyệt vời! trông chắc chắn. Bệnh cho nó đi! – mattyd

+0

Trong trường hợp này không chắc chắn làm cho một đối tượng Person đặc biệt có bất kỳ lợi thế nào so với một đối tượng chung chung. Tôi đoán sau đó xuống dòng bạn có thể muốn làm 'instanceof' vào nó? – jpsimons

+0

@darkporter Thật khó để nói từ một đoạn mã, phải không? Có lẽ một đối tượng Person đặc biệt sẽ có ích cho chức năng hơn nữa, có thể không phải là tất cả ... – Imp

2

Đối tượng thực tế:

o = {name: ['Matt', 'Tom', 'Mike'], rank: [34,1,17]}; 

Hãy một mảng cho cấu trúc dữ liệu tốt hơn:

var arr =[]; 
o.name.forEach(function(name, i){ 
     arr.push({name: name, rank: o.rank[i]}) 
}); 

Sắp xếp theo cấp bậc:

arr.sort(function(a,b){return a.rank - b.rank}); 

Sắp xếp theo tên:

arr.sort(function(a,b){return a.name- b.name}); 

Hoàn nguyên lại cấu trúc dữ liệu ban đầu của bạn:

o = {name:[], rank:[]} 
arr.forEach(function(item){ 
    o.name.push(item.name); 
    o.rank.push(item.rank); 
}); 
+0

forEach thật tuyệt. Đó có phải là phần mở rộng của Mozilla hay là trình duyệt chéo? – jpsimons

+0

['ForEach'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach) có sẵn trong hầu hết các trình duyệt và có thể có dự phòng trong các trình duyệt cũ hơn. – Mohsen

+0

Cảm ơn Mohsen! Tôi thích phương pháp forEach của bạn tốt nhất để cấu hình lại đối tượng hiện tại – mattyd

Các vấn đề liên quan