3 Sắp xếp mảng các đối tượng theo bản thảo tên đối tượng

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Sử dụng TypeScript, tôi đang cố gắng sắp xếp một mảng các Đối tượng theo tên của đối tượng thực tế chứ không phải khóa đối tượng. Một khóa tên cũng tồn tại trên các đối tượng này, đó là cùng tên của đối tượng thực tế. Tôi đang cố gắng để xem tôi đang đi sai ở đâu với logic của tôi ở đây. Tôi đã cố gắng sắp xếp theo khóa tên của đối tượng nhưng không thành công.

Tôi đã thử sử dụng hàm .sort () theo nhiều cách.

Một mảng ví dụ như sau:

templateReports = [

{"Project Report": {name: "Project Report", docType: "Project"}},
{"Department Report": {name: "Department Report", docType: "Department"}},
{"Room Report": {name: "Room Report", docType: "Room"}}

]

Tôi đã thử như sau:

templateReports.sort((a,b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0));

Tôi hiểu điều này không hoạt động vì để gọi khóa tên đầu tiên trong mảng, tôi có thể làm một cái gì đó như:

console.log(templateReports[0]["Project Report"].name);

và điều đó sẽ cho tôi giá trị tên cho đối tượng đầu tiên trong mảng. Vì vậy, tôi biết tôi sẽ phải sửa đổi cách tôi sử dụng hàm nguồn thành một dạng như:

templateReports.sort((a,b) => (a[nameOfObject].name > b[nameOfNextObject].name) ? 1 : ((b[nameOfNextObject].name > a[nameOfObject].name) ? -1 : 0));

Tôi đang cố gắng để sắp xếp theo thứ tự bảng chữ cái để trở thành:

templateReports = [

{"Department Report": {name: "Department Report", docType: "Department"}},
{"Project Report": {name: "Project Report", docType: "Project"}},
{"Room Report": {name: "Room Report", docType: "Room"}}

]

Làm cách nào để a) hoàn thành việc này bằng phương thức sắp xếp hoặc b) làm gì đó để sắp xếp theo tên thực của một đối tượng?

Cảm ơn bạn.

    
0
  1. Vui lòng gửi kết quả mà bạn muốn nhận.
    2019-05-08 15: 49: 15Z
  2. Tôi đã làm việc này bằng cách thực hiện như sau: this.templateReports.sort((a,b) => (Object.keys(a)[0] > Object.keys(b)[0]) ? 1 : ((Object.keys(b)[0] > Object.keys(a)[0]) ? -1 : 0));
    2019-05-08 16: 14: 26Z
3 Câu trả lời                              3                         

Khi bạn có một đối tượng như thế này:

let o = {"Project Report": {name: "Project Report", docType: "Project"}}

chuỗi đầu tiên là tên thuộc tính. tức là để có được các giá trị bạn phải viết một cái gì đó như:

o["Project Report"].name // => "Project Report"

Điều đó tạo ra một vấn đề cho bạn vì bạn không biết trước tên của khóa duy nhất bên trong các đối tượng bạn đang cố gắng sắp xếp theo.

Nhưng bạn có thể yêu cầu một đối tượng cho các khóa của nó bằng Object.keys():

let keys = Object.keys(o) // => ["Project Report"]

Và vì bạn biết rằng bạn chỉ có khóa trên mỗi đối tượng trong danh sách của mình nên bạn có thể viết một cái gì đó như thế này:

function getName(o) {
    return Object.keys(o)[0];
}

templateReports.sort((first, second) => getName(first).localeCompare(getName(second)));

    
1
2019-05-08 15: 55: 29Z
  1. Cảm ơn bạn, điều này đã hoạt động.
    2019-05-08 16: 25: 43Z

Để trả lời câu hỏi của bạn, bạn có thể lấy khóa đối tượng bằng cách gọi Object.keys(obj)[0] để nhận khóa vô số đầu tiên. Vì mỗi đối tượng này có chính xác một cặp khóa-giá trị, điều này sẽ hoạt động tốt. Nếu bạn thêm cặp khóa-giá trị thứ hai, điều này sẽ KHÔNG hoạt động.

Câu hỏi tiếp theo của tôi là tại sao các đối tượng ở cấu hình này ở vị trí đầu tiên? Xem xét các khóa đối tượng chỉ đơn giản là giá trị name được lặp lại, tôi nghĩ sẽ có ý nghĩa hơn khi có một mảng chỉ các đối tượng, phải không? Tôi không chắc chắn những gì bạn đạt được từ việc mỗi đối tượng được lồng vào một đối tượng thứ hai.

    
0
2019-05-08 15: 55: 18Z

Đó là một cấu trúc đối tượng kỳ lạ.

Bạn có thể làm điều đó - nhưng bạn cần tìm ra người truy cập của tài sản nên là gì. Làm thế nào để bạn xác định khóa này của từng đối tượng?

Bạn có thể sử dụng khóa đầu tiên trong đối tượng: ( từ chối trách nhiệm - điều này có duy trì được không?)

const accessSortingKey(object: Object): string {
    const key = Object.keys(object)[0];
    return key;
} 

const weirdArray = [
    {"Project Report": {name: "Project Report", docType: "Project"}},
    {"Department Report": {name: "Department Report", docType: "Department"}},
    {"Room Report": {name: "Room Report", docType: "Room"}}
];

weirdArray.sort((a, b) => {
   const aVal = accessSortingKey(a);
   const bVal = accessSortingKey(b);

   return aVal > bVal ? 1 : aVal < bVal ? -1 : 0;

});

    
0
2019-05-08 16: 02: 47Z
nguồn đặt đây