Object.entries()
trả về một mảng có các phần tử là các mảng tương ứng với các [key, value]
cặp thuộc tính có thể đếm được tìm thấy trực tiếp object
. Thứ tự của các thuộc tính giống như thứ tự được đưa ra bằng cách lặp qua các giá trị thuộc tính của đối tượng theo cách thủ công.
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Descrip
Các Object.entries
chức năng lợi nhuận gần như đầu ra chính xác mà bạn đang yêu cầu, trừ các phím là chuỗi thay vì con số.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
console.log(Object.entries(obj));
Nếu bạn cần các khóa là số, bạn có thể ánh xạ kết quả sang một mảng mới với chức năng gọi lại thay thế khóa trong mỗi cặp bằng một số được ép từ nó.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(input);
return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
}
console.log(toNumericPairs(obj));
Tôi sử dụng một hàm mũi tên và Object.assign
cho hàm gọi lại bản đồ trong ví dụ trên để tôi có thể giữ nó trong một lệnh bằng cách tận dụng thực tế Object.assign
trả về đối tượng được gán và giá trị trả về của một mũi tên lệnh là kết quả của lệnh.
Điều này tương đương với:
entry => {
entry[0] = +entry[0];
return entry;
}
Như @TravisClarke đã đề cập trong các bình luận, chức năng bản đồ có thể được rút ngắn thành:
entry => [ +entry[0], entry[1] ]
Tuy nhiên, điều đó sẽ tạo ra một mảng mới cho mỗi cặp khóa-giá trị, thay vì sửa đổi mảng hiện có tại chỗ, do đó nhân đôi số lượng mảng cặp giá trị khóa được tạo. Mặc dù mảng mục nhập ban đầu vẫn có thể truy cập, nhưng các mục nhập của nó sẽ không được thu gom rác.
Bây giờ, mặc dù sử dụng phương thức tại chỗ của chúng tôi vẫn sử dụng hai mảng chứa các cặp giá trị khóa (mảng đầu vào và mảng đầu ra), tổng số mảng chỉ thay đổi theo một. Các mảng đầu vào và đầu ra không thực sự chứa đầy các mảng, mà là các tham chiếu đến các mảng và các tham chiếu đó chiếm một lượng không gian không đáng kể trong bộ nhớ.
- Sửa đổi từng cặp khóa-giá trị tại chỗ dẫn đến tăng trưởng bộ nhớ không đáng kể, nhưng yêu cầu nhập thêm một vài ký tự.
- Tạo một mảng mới cho mỗi cặp khóa-giá trị dẫn đến nhân đôi số lượng bộ nhớ cần thiết, nhưng yêu cầu nhập ít hơn một vài ký tự.
Bạn có thể tiến thêm một bước và loại bỏ hoàn toàn sự tăng trưởng bằng cách sửa đổi mảng mục nhập tại chỗ thay vì ánh xạ nó sang một mảng mới:
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(obj);
entries.forEach(entry => entry[0] = +entry[0]);
return entries;
}
console.log(toNumericPairs(obj));
NaN
thay vào đó. Nếu bạn muốn sử dụng chuỗi như là chìa khóa của bạn, thay đổi trở về từ[Number(key), obj[key]]
đến[key, obj[key]]
hoặc sử dụngObject.entries
như @Pila gợi ý trong câu trả lời của họ