當須要從含有衆多字段的一個對象中取出部分字段,來組成新的對象時,你一般會怎麼實現?javascript
若是這些字段裏,有的字段可能並無出現呢?是否須要每一個字段都判斷一次呢?給你們分享一個從 Stack Overflow 上抄來的方法(🤦️):java
const pick = (...props) =>
ob => props.reduce((other, e) => ob[e] !== undefined ? { ...other, [e]: ob[e] } : other, {});
複製代碼
這個 pick 方法是一個柯里化的函數,在向其中傳入所需字段後,返回的函數能夠將入參對象的對應字段提取到新的對象中,並過濾因爲入參對象未定義 key 產生的 undefined 值。函數
調用方法以下:spa
const source = { a: 1, b: 2, c: 3 };
const result = pick('a', 'c', 'd')(source); // { a: 1, c: 3 }
複製代碼
將這個方法改寫得好理解一些:code
function pickerGenerate(keys) {
return function(ob) {
const result = {};
keys.forEach(key => {
if (ob[key] !== undefined) {
result[key] = ob[key];
}
});
return result;
}
}
// 生成針對特定字段的 picker 函數
const specifiedPicker = pickerGenerate(['a', 'c', 'd']);
const source = { a: 1, b: 2, c: 3 };
const result = specifiedPicker(source); // { a: 1, c: 3 }
複製代碼