2016-11-12 15 views
5

Nói, tôi có một đối tượng:Cách hiệu quả nhất để sao chép một số thuộc tính từ một đối tượng trong JavaScript là gì?

const user = {_id: 1234, firstName: 'John', lastName: 'Smith'} 

Tôi muốn tạo ra một đối tượng khác mà không cần chìa khóa _id:

const newUser = {firstName: 'John', lastName: 'Smith'} 

Tôi đang sử dụng này:

const newUser = Object.assign({}, {firstName: user.firstName, lastName: user.lastName}) 

Có một tốt hơn cách để làm điều này?

Trả lời

5

Bạn có thể đạt được điều đó với destructuring và đối tượng thuộc tính còn lại:

const user = {_id: 1234, fistName: 'John', lastName: 'Smith'} 
const {_id, ...rest} = user; 
console.log(rest); 

Tuy nhiên rest/rpread properties vẫn là một ecmascript's proposal (hiện ở giai đoạn 3). Bạn có thể sử dụng nó với lớp transpilation như babel.

4

Làm theo phương pháp Array#reduce với phương thức Object.keys.

const user = { 
 
    _id: 1234, 
 
    fistName: 'John', 
 
    lastName: 'Smith' 
 
}; 
 

 
var res = Object.keys(user).reduce(function(obj, k) { 
 
    if (k != '_id') obj[k] = user[k]; 
 
    return obj; 
 
}, {}); 
 

 
console.log(res);

+2

Tôi tự hỏi làm thế nào điều này có thể nhanh hơn nhiệm vụ mà OP tạo ra. – trincot

+1

@trincot - tại sao không đọc câu hỏi, nó nói * "Tôi muốn tạo một đối tượng khác mà không có phím' _id' "*, và sau đó OP hiển thị đối tượng là kết quả mong đợi và tiếp tục nói rằng anh ta đang sử dụng 'Object.assign', không phải là sự xác nhận trực tiếp. – adeneo

+0

Thật vậy, 'Object.assign' dĩ nhiên là không cần thiết trong mã OP. – trincot

0

Các hiệu quả nhất rất có thể sẽ là một vòng lặp thường xuyên

const user = {_id: 1234, fistName: 'John', lastName: 'Smith'}; 
 
let obj = {}, key; 
 

 
for (key in user) { 
 
    if (key !== '_id') obj[key] = user[key]; 
 
} 
 

 
console.log(obj)

+1

Làm thế nào một vòng lặp có thể nhanh hơn nhiệm vụ trực tiếp mà OP thực hiện? – trincot

+0

@trincot - 'Object.assign' không phải là" assigment trực tiếp ", nó là một phương thức nội bộ lặp lại, thực hiện kiểm tra và tạo một đối tượng mới, và nó không hiệu quả lắm -> ** https: //jsperf.com/ object-copy-efficiency-s **. Tất nhiên, nếu op ** có thể ** sử dụng trực tiếp assigment, và có thể tham khảo các phím trực tiếp, đó là nhanh hơn, nhưng điều này chỉ bỏ ra '_id' tài sản, giống như các câu trả lời khác, và giả định một không luôn luôn muốn sử dụng tất cả các phím. – adeneo

+0

Thật vậy, 'Object.assign' dĩ nhiên là không cần thiết trong mã OP. – trincot

1

Bạn đang dùng một bản sao cạn hai lần: một lần với các đối tượng theo nghĩa đen, và một lần nữa với Object.assign. Vì vậy, chỉ cần sử dụng đầu tiên của hai:

const newUser = {firstName: user.firstName, lastName: user.lastName}; 
3

Một thay thế cho câu trả lời khác là sử dụng destruct syntax với đó nêu rõ các thuộc tính để sao chép:

const user = { _id: 1234, firstName: 'John', lastName: 'Smith' } 

const newUser = { firstName, lastName } = user 

Bảng liệt kê các thuộc tính đôi khi có thể là tốt hơn tùy chọn vì nó giúp hiểu được thuộc tính mà bản sao sẽ có. Đặc biệt nếu chúng ta không thể thấy ngay trong mã nguồn mà các thuộc tính của đối tượng gốc có.

+0

dòng thứ hai không hoạt động theo cách bạn nghĩ ... nó tạo ra hai biến (firstName và lastName) chứ không phải là một đối tượng có hai thuộc tính. Chúa biết những gì được giao cho newUser ... có lẽ là người dùng ?? – user292701

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