2016-10-30 114 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 ...'。 –