[英]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。在这里我们使用over
和lensProp
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.