【问题标题】:omit nested properties with Lodash使用 Lodash 省略嵌套属性
【发布时间】:2015-12-20 00:19:33
【问题描述】:

我正在尝试删除以下对象中的属性5MinuteRate15MinuteRate

var object = { requestsPerSecond:
   { mean: 1710.2180279856818,
     count: 10511,
     'currentRate': 1941.4893498239829,
     '1MinuteRate': 168.08263156623656,
     '5MinuteRate': 34.74630977619571,
     '15MinuteRate': 11.646507524106095 } };

Lodash 的 omit() 函数似乎不适用于嵌套对象。以下代码不起作用:

console.log(_.omit(object, 'requestsPerSecond.count'));

编辑:

我试过了,但效果不太好:

var subObject = _.omit(object.requestsPerSecond, '5MinuteRate', '15MinuteRate');

console.log(_.merge(object, subObject));

【问题讨论】:

  • 如果您只需要 json,您可以将其与具有函数值的空 shell 合并,否则自定义 map() 回调和一对 delete 语句是最简单的选择。
  • 我尝试了合并,但我犯了一个错误。嵌套对象在顶层合并。你能看看它(在问题中)

标签: javascript lodash


【解决方案1】:

你快到了。只需将subObject 的结果分配给object.requestsPerSecond

var object = {
  requestsPerSecond: {
    mean: 1710.2180279856818,
    count: 10511,
    'currentRate': 1941.4893498239829,
    '1MinuteRate': 168.08263156623656,
    '5MinuteRate': 34.74630977619571,
    '15MinuteRate': 11.646507524106095
  }
};

object.requestsPerSecond = _.omit(object.requestsPerSecond, '5MinuteRate', '15MinuteRate');

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

【讨论】:

  • _.omit 在这种情况下将返回 object.requestsPerSecond 或 object ?
  • @MohammedYassineCHABLI _.omit 返回 requestsPerSecond 子对象,减去指定的属性。请注意我如何将其设置回 object.requestsPerSecond 以覆盖之前的值。
【解决方案2】:

使用未设置:https://lodash.com/docs#unset,它会变得更干净:

var obj = { 
  requestsPerSecond: { 
    mean: 1710.2180279856818,
    count: 10511,
    'currentRate': 1941.4893498239829,
    '1MinuteRate': 168.08263156623656,
    '5MinuteRate': 34.74630977619571,
    '15MinuteRate': 11.646507524106095 
  } 
};

_.forEach(['requestsPerSecond.5MinuteRate', 'requestsPerSecond.15MinuteRate'], 
  function(omitProperty) {
    obj = _.unset(obj, omitProperty);
  }
);

// Or avoiding the "extra" loop.
obj = _.unset(obj, 'requestsPerSecond.5MinuteRate');
obj = _.unset(obj, 'requestsPerSecond.15MinuteRate');

【讨论】:

  • 谢谢@OscarRyz,我已经编辑了答案以使用_.unset;我想我本来是想的,但是打错了。
【解决方案3】:

Lodash _.omit 适用于嵌套对象。自从您提出问题以来,他们似乎改进了功能:)

object = _.omit(object, 'requestsPerSecond.5MinuteRate', 'requestsPerSecond.15MinuteRate');

更新

省略将从 Lodash 5 开始移除

【讨论】:

  • 貌似会有no omit in Lodash v5
  • 这真的有效吗?使用 v 4.5.0 omit({ data: {a: 1, b: 2} }, 'data.a') == { data: { a: 1, b: 2 } }
【解决方案4】:

如果您需要深入省略某些路径,这里是来自 Deepdash 的 omitDeep

obj = _.omitDeep(obj, /\.*5MinuteRate"\]$/);

请注意,此方法将排除任何深度的所有匹配路径。 它支持单个路径或数组,表示为常量值或正则表达式。

在字符串路径作为参数给出的情况下,将检查对象中的每个路径是否以给定条件结束。 这里有更详细的codepen for your case

(答案已更新以适合最新的 Deepdash v3.1.0)

【讨论】:

    【解决方案5】:

    如果您愿意尝试其他库,partial.lenses 对集合的所有类型的操作都有很好的支持,包括复杂的修改,例如对象的所有子对象等等。

    所以在你的情况下,它就像(L 只是从 partial.lesnes 导入的简写)一样简单

    const newObject = L.remove(['requestsPerSecond','5MinuteRate'],object)
    

    现在假设您有一个不同的结构,其中有一组名称不同但结构相同的嵌套属性,并且您希望针对所有这些属性。想象一下这个例子:

    obj = { 
      requestsPerSecond: {
      first: {
        mean: 1710.2180279856818,
        count: 10511,
        '5MinuteRate': 34.74630977619571,
        '15MinuteRate': 11.646507524106095 
      }}
      second: {
        mean: 1710.2180279856818,
        count: 10511,
        '5MinuteRate': 34.74630977619571,
        '15MinuteRate': 11.646507524106095 
      }} 
    };
    

    在这种情况下,它会很简单:

    const newObject = L.remove(['requestsPerSecond',L.children,'5MinuteRate'],object)
    

    其中 L.children 表示针对 requestPerSecond 的所有子级。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2021-10-23
      • 2019-07-29
      • 2018-01-03
      • 2020-04-14
      • 1970-01-01
      • 2017-01-10
      相关资源
      最近更新 更多