过滤嵌套对象
Posted
技术标签:
【中文标题】过滤嵌套对象【英文标题】:Filter nested object 【发布时间】:2020-07-28 12:20:56 【问题描述】:我收到一个如下所示的对象:
this.tokensData =
O:
id: 0,
name: value1,
organization: organization1,
...,
,
1:
id: 1,
name: value1,
organization: organization1,
...,
,
2:
id: 2,
name: value2,
organization: organization2,
...,
,
...
我想按id
过滤并删除id
与我从store
收到的id
匹配的Object
。到目前为止我尝试了什么:
const filteredObject = Object.keys(this.tokensData).map((token) =>
if (this.$store.state.id !== this.tokensData[token].id)
return this.tokensData[token];
);
这会将Object
替换为undefined
- 这可以满足我的目的,但显然并不理想。
非常感谢任何帮助!
【问题讨论】:
【参考方案1】:undefined
的问题是由于在箭头函数中使用this
引起的。如果函数是箭头函数,则 javascript 作用域赋予 this
不同的含义。
另外我建议使用过滤器。
.map
用于转换 A -> B。
.filter
应该用于过滤掉对象。
现在如果我们把它结合起来就会变成这样。
function filterById(token)
return this.$store.state.id !== this.tokensData[token].id;
function getTokenData(token)
return this.tokensData[token]
const token = Object.keys(this.tokensData)
.filter(filterById)
.map(getTokenData);
);
请注意,我没有使用箭头函数。由于 javascript 处理范围的方式,箭头函数不能引用 this
。
另一种方法是将this
引用到变量中,以便您的箭头函数可以访问该变量。
const self = this;
const token = Object.keys(this.tokensData)
.filter(token => self.$store.state.id !== self.tokensData[token].id)
.map(token => self.tokensData[token]);
你也可以使用 Object.entries 让它变得更好。这将返回一个键和值数组,您可以使用 es6 语法对其进行解构,如下所示[key, value]
。
const self = this;
const token = Object.entries(this.tokensData)
.filter(([key, value]) => self.$store.state.id !== value.id)
.map(([key, value]) => value);
【讨论】:
我正在使用 Vue,所以不确定我的问题是否源于this
。但是您提出的过滤方式效果很好 - 谢谢!【参考方案2】:
您可以使用Object.entries
和Object.fromEntries
来做到这一点:
const filteredObject = Object.fromEntries(
Object.entries(this.tokensData).filter(
([key, value]) => value.id !== this.$store.state.id
)
)
【讨论】:
类似于@StepUp 答案 - 效果很好。谢谢!【参考方案3】:这可以通过克隆对象并删除ID处的对象来完成:
const removeObjectByID = (obj, id) =>
// first create a copy of the object
const copy = JSON.parse(JSON.stringify(obj))
// next, delete the one entry you don't want
delete copy[id]
// finally, return the new object
return copy
// Test
const data = a:1, b: 2, c: 3
console.log(removeObjectByID(data, 'b')) // a: 1, c: 3
【讨论】:
【参考方案4】:尝试使用Object.entries
然后Object.fromEntries()
从键值对列表中创建一个对象:
let store = [0 , 1];
const result = Object.entries(tokensData).filter(([k, v]) => !store.some(s => s == v.id));
console.log(Object.fromEntries(result));
一个例子:
let tokensData =
O:
id: 0,
name: '',
organization: '',
,
1:
id: 1,
name: '',
organization: '',
,
2:
id: 2,
name: '',
organization: '',
let store = [0 , 1];
const result = Object.entries(tokensData).filter(([k, v]) => !store.some(s => s == v.id));
console.log(Object.fromEntries(result));
【讨论】:
@suuuriam 很高兴它对你有所帮助!:)以上是关于过滤嵌套对象的主要内容,如果未能解决你的问题,请参考以下文章
使用 Azure Synapse pyspark 过滤器根据嵌套对象的数据类型展平嵌套的 json 对象