5

Đây là cách tôi đã làm việc đó:Đối tượng sao chép cạn để lại một hoặc nhiều thuộc tính trong ES6/ES7?

var props = { id: 1, name: 'test', children: [] } 
 

 
//copy props but leave children out 
 
var newProps = { ...props } 
 
delete newProps.children 
 

 
console.log(newProps) // { id: 1, name: 'test' }

Có một trình dọn dẹp, cách đơn giản hơn?

+0

Tôi không hiểu. Bạn chưa viết dòng quan trọng nhất, nơi bạn sao chép đạo cụ vào newProps. "..." là gì? – Gavriel

+0

@ william.taylor.09, không trùng lặp. Anh ấy biết cách sao chép (anh ấy không thể hiện dòng đó) nhưng anh ấy muốn sao chép tất cả các thuộc tính ngoại trừ một số trong danh sách đen – Gavriel

+0

@Gavriel không dòng này về cơ bản nông sao chép các thuộc tính đối tượng mới 'var newProps = {.. .props} '? Sắp xếp giống như làm 'var newProps = Object.assign ({}, props)' –

Trả lời

8

Bạn có thể sử dụng một destructuring assignment:

var props = { id: 1, name: 'test', children: [] } 

var {children:_, ...newProps} = props; 
console.log(newProps) // { id: 1, name: 'test' } 
console.log(_) // [] - as an "empty" placeholder 

(với cùng rest/spread properties proposal for ES7 mà bạn đã được sử dụng)

+0

Vâng, tôi nghĩ rằng đây là lựa chọn tốt nhất - tôi đã làm một cái gì đó tương tự trước đây. Tôi chỉ muốn có một cái gì đó rõ ràng hơn ... –

+0

Tôi nghĩ rằng nó khá rõ ràng đã ... Nếu muốn, bạn có thể viết một aptly tên chức năng '(khóa, {[key]: _, ... phần còn lại)) => phần còn lại' và gọi nó. – Bergi

+1

'/ * eslint no-unused-vars: [" error ", {" varsIgnorePattern ":" _ "] * /' Có ích để loại bỏ các lỗi eslint khi sử dụng kỹ thuật này – icc97

1

var props = { id: 1, name: 'test', children: [] } 
 

 
function clone(orig, blacklistedProps) { 
 
    var newProps = {}; 
 
    Object.keys(props).forEach(function(key) { 
 
     if (!blacklistedProps || blacklistedProps.indexOf(key) == -1) { 
 
      newProps[key] = props[key]; 
 
     } 
 
    }); 
 
    return newProps; 
 
} 
 
var newProps = clone(props, ['children']); 
 
console.log(newProps) // { id: 1, name: 'test' } 
 
var newProps1 = clone(props); 
 
console.log(newProps1) // { id: 1, name: 'test', children:[] }

+0

Cảm ơn @gavriel. Yeah cho rằng vấn đề tôi đoán tôi có thể bọc logic của tôi trong một chức năng clone. Tôi chỉ hy vọng có một cách ngắn gọn hơn. –

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