过滤嵌套对象

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.entriesObject.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 对象

过滤嵌套对象

返回根据嵌套对象过滤的 BigQuery 数据

如何过滤嵌套集合实体框架对象?

我的弹性映射中有一个嵌套对象。我正在尝试为该嵌套对象创建过滤器查询

基于嵌套值的数组过滤对象数组