VueJS与Lodash:如何获取仅包含带_new后缀键的对象数组?
如何用Lodash筛选对象中带
_new后缀的属性 你的问题出在两个关键细节上:
- 你直接对数组使用
omitBy,但数组的键是数字索引(比如0、1),这些索引永远不会以_new结尾,所以omitBy相当于没做任何过滤,直接返回原数组。 omitBy的作用是移除符合条件的键,而你需要的是保留带_new后缀的键,应该用pickBy方法更合适。
正确的解决方案
你需要遍历数组中的每一个对象,对每个对象单独使用pickBy来筛选出键以_new结尾的属性。可以结合Lodash的map和pickBy来实现:
<template> <div>{{ newProperties }}</div> </template> <script> import { map, pickBy } from "lodash"; import data from "../assets/data.json"; export default { data() { return { localShortNames: data, }; }, computed: { newProperties() { // 遍历数组中的每个对象,筛选出带_new后缀的属性 return map(this.localShortNames, (obj) => pickBy(obj, (value, key) => key.endsWith("_new")) ); }, }, }; </script>
额外优化:移除属性名的_new后缀
如果希望最终的属性名去掉_new(比如把name_new变成name),可以再结合mapKeys方法做进一步处理:
<template> <div>{{ newProperties }}</div> </template> <script> import { map, pickBy, mapKeys } from "lodash"; import data from "../assets/data.json"; export default { data() { return { localShortNames: data, }; }, computed: { newProperties() { return map(this.localShortNames, (obj) => { // 先筛选出带_new的属性 const newProps = pickBy(obj, (_, key) => key.endsWith("_new")); // 再移除属性名的_new后缀 return mapKeys(newProps, (_, key) => key.replace("_new", "")); }); }, }, }; </script>
关于omitBy的替代用法
如果一定要用omitBy,逻辑会反过来:移除不以_new结尾的属性,效果和pickBy一致,但可读性不如pickBy直接:
pickBy(obj, (_, key) => key.endsWith("_new")) // 等价于 omitBy(obj, (_, key) => !key.endsWith("_new"))
内容的提问来源于stack exchange,提问作者redshift
相关产品推荐
相关产品推荐

