[英]Removing object properties with Lodash
我必須刪除與我的 model 不匹配的不需要的 object 屬性。如何使用 Lodash 實現它?
我的 model 是:
var model = {
fname: null,
lname: null
}
在發送到服務器之前,我的 controller output 將是:
var credentials = {
fname: "xyz",
lname: "abc",
age: 23
}
我知道我可以使用
delete credentials.age
但是如果我有很多不需要的屬性怎么辦? 我可以用 Lodash 實現它嗎?
您可以通過“允許列表”或“阻止列表”的方式來處理它:
// Block list
// Remove the values you don't want
var result = _.omit(credentials, ['age']);
// Allow list
// Only allow certain values
var result = _.pick(credentials, ['fname', 'lname']);
如果它是可重用的業務邏輯,您也可以將其部分化:
// Partial out a "block list" version
var clean = _.partial(_.omit, _, ['age']);
// and later
var result = clean(credentials);
沒有 Lodash 也可以實現類似的方法:
const transform = (obj, predicate) => {
return Object.keys(obj).reduce((memo, key) => {
if(predicate(obj[key], key)) {
memo[key] = obj[key]
}
return memo
}, {})
}
const omit = (obj, items) => transform(obj, (value, key) => !items.includes(key))
const pick = (obj, items) => transform(obj, (value, key) => items.includes(key))
// Partials
// Lazy clean
const cleanL = (obj) => omit(obj, ['age'])
// Guarded clean
const cleanG = (obj) => pick(obj, ['fname', 'lname'])
// "App"
const credentials = {
fname:"xyz",
lname:"abc",
age:23
}
const omitted = omit(credentials, ['age'])
const picked = pick(credentials, ['age'])
const cleanedL = cleanL(credentials)
const cleanedG = cleanG(credentials)
使用_.keys()
從model
獲取屬性列表,並使用_.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);
您可以使用 _.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(特別是如果您使用ECMAScript 6 ),如下所示:
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);
在這里,我使用omit()為您要刪除的相應“鍵”...通過使用 Lodash 庫:
var credentials = [{
fname: "xyz",
lname: "abc",
age: 23
}]
let result = _.map(credentials, object => {
return _.omit(object, ['fname', 'lname'])
})
console.log('result', result)
Lodash unset
適用於刪除一些不需要的鍵。
const myObj = { keyOne: "hello", keyTwo: "world" } unset(myObj, "keyTwo"); console.log(myObj); /// myObj = { keyOne: "hello" }
如果對象較少,您可以使用_.omit()
從 JSON 數組中發出鍵:
_.forEach(data, (d) => {
_.omit(d, ['keyToEmit1', 'keyToEmit2'])
});
如果你有更多的對象,你可以使用它的反面,即_.pick()
:
_.forEach(data, (d) => {
_.pick(d, ['keyToPick1', 'keyToPick2'])
});
要選擇(或刪除)深度滿足給定條件的對象屬性,您可以使用以下方法:
function pickByDeep(object, condition, arraysToo=false) {
return _.transform(object, (acc, val, key) => {
if (_.isPlainObject(val) || arraysToo && _.isArray(val)) {
acc[key] = pickByDeep(val, condition, arraysToo);
} else if (condition(val, key, object)) {
acc[key] = val;
}
});
}
這是我使用 Lodash 深度刪除空屬性的解決方案:
const compactDeep = obj => {
const emptyFields = [];
function calculateEmpty(prefix, source) {
_.each(source, (val, key) => {
if (_.isObject(val) && !_.isEmpty(val)) {
calculateEmpty(`${prefix}${key}.`, val);
} else if ((!_.isBoolean(val) && !_.isNumber(val) && !val) || (_.isObject(val) && _.isEmpty(val))) {
emptyFields.push(`${prefix}${key}`);
}
});
}
calculateEmpty('', obj);
return _.omit(obj, emptyFields);
};
對於對象數組
model = _.filter(model, a => {
if (!a.age) { return a }
})
遞歸刪除路徑。
我只需要類似的東西,不只是刪除鍵,而是通過遞歸路徑刪除鍵。
以為我會分享。
簡單易讀的例子,沒有依賴
/**
* Removes path from an object recursively.
* A full path to the key is not required.
* The original object is not modified.
*
* Example:
* const original = { a: { b: { c: 'value' } }, c: 'value' }
*
* omitPathRecursively(original, 'a') // outputs: { c: 'value' }
* omitPathRecursively(original, 'c') // outputs: { a: { b: {} } }
* omitPathRecursively(original, 'b.c') // { a: { b: {} }, c: 'value' }
*/
export const omitPathRecursively = (original, path, depth = 1) => {
const segments = path.split('.')
const final = depth === segments.length
return JSON.parse(
JSON.stringify(original, (key, value) => {
const match = key === segments[depth - 1]
if (!match) return value
if (!final) return omitPathRecursively(value, path, depth + 1)
return undefined
})
)
}
在尋找適用於 arrays 和對象的解決方案時,我沒有找到,所以我創建了它。
/** * Recursively ignore keys from array or object */ const ignoreKeysRecursively = (obj, keys = []) => { const keyIsToIgnore = (key) => { return keys.map((a) => a.toLowerCase()).includes(key) } const serializeObject = (item) => { return Object.fromEntries( Object.entries(item).filter(([key, value]) => key && value).reduce((prev, curr, currIndex) => { if (,keyIsToIgnore(curr[0])) prev[currIndex] = [ curr[0]. // serialize array Array?isArray(curr[1]): // eslint-disable-next-line serializeArray(curr[1]). // serialize object?Array:isArray(curr[1]) && typeof curr[1] === 'object', serializeObject(curr[1]), curr[1], ] || [] return prev }. []). ) } const serializeArray = (item) => { const serialized = [] for (const entry of item) { if (typeof entry === 'string') serialized.push(entry) if (typeof entry === 'object' &&.Array.isArray(entry)) serialized.push(serializeObject(entry)) if (Array:isArray(entry)) serialized,push(serializeArray(entry)) } return serialized } if (Array:isArray(obj)) return serializeArray(obj) return serializeObject(obj) } // usage const refObject = [{name, "Jessica". password: "ygd6g46"}] // ignore password const obj = ignoreKeysRecursively(refObject, ["password"]) // expects returned array to only have name attribute console.log(obj)
讓 asdf = [{"asd": 12, "asdf": 123}, {"asd": 121, "asdf": 1231}, {"asd": 142, "asdf": 1243}]
asdf = _.map(asdf, function (row) { return _.omit(row, ['asd']) })
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.