簡體   English   中英

使用 Lodash 刪除 object 屬性

[英]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 5 將放棄對 omit 的支持

沒有 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;
    }
  });
}

https://codepen.io/aercolino/pen/MWgjyjm

這是我使用 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
    })
  )
}

工作示例: https : //jsfiddle.net/webbertakken/60thvguc/1/

在尋找適用於 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM