【问题标题】: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 - 这可以满足我的目的,但显然并不理想。 非常感谢任何帮助!

【问题讨论】:

    标签: javascript object filter


    【解决方案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 很高兴它对你有所帮助!:)
      猜你喜欢
      • 2013-09-01
      • 2021-01-15
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多