2016-10-30 170 views
17

我必須刪除不符合我的模型的不需要的對象屬性。我如何用lodash實現它。使用lodash刪除對象屬性

我的模型是

var model = { 
    fname:null, 
    lname:null 
} 

我控制器輸出發送給服務器將

var credentials = { 
    fname:"xyz", 
    lname:"abc", 
    age:23 
} 

之前,如果我使用

_.extend (model, credentials) 

我得到age屬性了。我知道我可以使用

delete credentials.age 

但如果我有超過10個不需要的對象。我可以用lodash達到它嗎?

回答

18

獲得從model使用_.keys()屬性的列表,並使用_.pick()credentials提取屬性,以一個新的對象:

var model = { 
 
    fname:null, 
 
    lname:null 
 
}; 
 

 
var credentials = { 
 
    fname:"xyz", 
 
    lname:"abc", 
 
    age:23 
 
}; 
 

 
var result = _.pick(credentials, _.keys(model)); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

如果你不想使用lodash ,您可以使用Object.keys()Array.prototype.reduce()

var model = { 
 
    fname:null, 
 
    lname:null 
 
}; 
 

 
var credentials = { 
 
    fname:"xyz", 
 
    lname:"abc", 
 
    age:23 
 
}; 
 

 
var result = Object.keys(model).reduce(function(obj, key) { 
 
    obj[key] = credentials[key]; 
 
    return obj; 
 
}, {}); 
 

 
console.log(result);

3

您可以輕鬆地做到這一點使用_.pick:

var model = { 
 
fname:null, 
 
lname:null 
 
}; 
 

 
var credentials = { 
 
    fname: 'abc', 
 
    lname: 'xyz', 
 
    age: 2 
 
}; 
 

 
var result = _.pick(credentials, _.keys(model)); 
 

 

 
console.log('result =', result);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>

但是你可以簡單地使用純JavaScript(特別是如果你使用ES6),這樣的:

const model = { 
 
    fname: null, 
 
    lname: null 
 
}; 
 

 
const credentials = { 
 
    fname: 'abc', 
 
    lname: 'xyz', 
 
    age: 2 
 
}; 
 

 
const newModel = {}; 
 

 
Object.keys(model).forEach(key => newModel[key] = credentials[key]); 
 

 
console.log('newModel =', newModel);

35

您可以從白名單或黑名單的方式來解決:

// Black list 
// Remove the values you don't want 
var result = _.omit(credentials, ['age']); 

// White list 
// Only allow certain values 
var result = _.pick(credentials, ['fname', 'lname']); 

如果它是可重用的業務邏輯,可以部分出來,以及:

// Partial out a black list version 
var clean = _.partial(omit, _, ['age']); 

// and later 
var result = clean(credentials); 
+1

這是正確的因爲刪除的函數是'_.omit',而'_.pick'指定了你想要的(這恰恰相反) – thiagoh

+0

是正確的 - 並且取決於你的一般方法和周圍的業務邏輯 - 兩個版本都會依賴於你的要求 – Chris

+0

對於部分你犯了一個錯字,它的'_.partial(_。omit ...'。 –