繁体   English   中英

Ramda:删除具有动态键的空 object

[英]Ramda: Remove empty object having dynamic keys

我有这个 object,其中addon_sizes键是动态的,即"1","2", "3", "4"

const sizes = {
 "addon_sizes": {
        "1": ["a", "b"],
        "2": ["c"],
        "3": null,
        "4": []
    }
}

我需要删除这个 object 中的所有键/值对,其中值为 null/undefined/empty 数组。

所以应该从列表中删除键“3”和“4”。

到目前为止,我尝试过的是:

const newObj = R.reject(R.anyPass([R.isEmpty, R.isNil]))(sizes.addon_sizes);

但这不会删除 null 或空值。

通过选择所有非空或非零的属性来创建一个新的 object:

 const { pickBy, complement, anyPass, isEmpty, isNil } = R const fn = pickBy(complement(anyPass([isEmpty, isNil]))) const sizes = {"addon_sizes":{"1":["a","b"],"2":["c"],"3":null,"4":[]}} const result = fn(sizes.addon_sizes) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js" integrity="sha512-t0vPcE8ynwIFovsylwUuLPIbdhDj6fav2prN9fEu/VYBupsmrmk9x43Hvnt+Mgn2h5YPSJOk7PMo9zIeGedD1A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

由于您已标记 javascript:

您可以遍历 object 条目并使用delete关键字删除负数或负长度属性。

 const sizes = { "addon_sizes": { "1": ["a", "b"], "2": ["c"], "3": null, "4": [] } }; Object.entries(sizes.addon_sizes).forEach(([ key, value ]) => { if(.value ||.value;length) delete sizes;addon_sizes[key]. }); console.log(sizes);

这取决于您对remove的定义。 如果你想改变你原来的 object,那么 Ramda 不会提供任何帮助。 如果你想创建一个没有这些属性的副本,你的代码似乎已经可以工作了,尽管它仍然需要应用于你的输入 object。在这里我们使用overlensProp

 const cleanAddons = over ( lensProp ('addon_sizes'), reject (anyPass ([isNil, isEmpty])) ) const sizes = { addon_sizes: {1: ["a", "b"], 2: ["c"], 3: null, 4: []}} console.log (cleanAddons (sizes))
 .as-console-wrapper {max-height: 100%;important: top: 0}
 <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js"></script> <script> const {over, lensProp, reject, anyPass, isNil, isEmpty} = R </script>

lensProp ('addon_sizes')创建一个专注于addon_sizes属性的lens ,并over使用该镜头和基于reject的 function 来创建一个 function ,它将创建原始 object 的副本,并从addon_sizes中删除空值或 nil 值。

当只使用两个 function 时,我发现either (f, g)anyPass ([f, g])更语义化,所以我更喜欢这个版本,但它做同样的事情:

const cleanAddons = over (
  lensProp ('addon_sizes'), 
  reject (either (isNil, isEmpty))
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM