【问题标题】:Advanced filter object in jsjs中的高级过滤器对象
【发布时间】:2020-04-15 15:30:22
【问题描述】:

我正在尝试使用 Object 过滤数组对象,但我不知道该怎么做。 示例:

{
  245: [
    {
      id: "12",
      name: "test",
      status: "new"
    },
    {
      id: "15",
      name: "test2",
      status: "old"
    },
    {
      id: "12",
      name: "test2",
      status: "old"
    }],
  2815: [
    {
      id: "19",
      name: "test",
      status: "new"
    },
    {
      id: "50",
      name: "test2",
      status: "old"
    },
    {
      id: "120",
      name: "test2",
      status: "new"
    }]
}

如果 status = "new" 需要过滤,但结构不能改变:

{
  245: [{
    id: "12",
    name: "test",
    status: "new"
  }],
  2815: [{
    id: "19",
    name: "test",
    status: "new"
  },
  {
    id: "120",
    name: "test2",
    status: "new"
  }]
}

【问题讨论】:

  • 你保存数据的对象有名字吗?

标签: javascript arrays object filter


【解决方案1】:

遍历条目并使用过滤值创建一个新对象

const obj = {
245:[
{id:"12",name:"test",status:"new"},{id:"15",name:"test2",status:"old"},{id:"12",name:"test2",status:"old"}],
2815:[
{id:"19",name:"test",status:"new"},{id:"50",name:"test2",status:"old"},{id:"120",name:"test2",status:"new"}]
}

console.log(filter(obj, item => item.status === "new"))

function filter(obj, pred) {
  return Object.fromEntries(Object.entries(obj).map(([name, value]) => [name, value.filter(pred)]))
}

【讨论】:

    【解决方案2】:

    您需要先映射对象键,然后再映射数组元素以过滤掉最终结果

    var obj = {
    245:[
    {id:"12",name:"test",status:"new"},{id:"15",name:"test2",status:"old"},{id:"12",name:"test2",status:"old"}],
    2815:[
    {id:"19",name:"test",status:"new"},{id:"50",name:"test2",status:"old"},{id:"120",name:"test2",status:"new"}]
    }
    
    var res = Object.entries(obj).reduce((acc, [key, value]) => {
      acc[key] = value.filter(item => item.status === "new");
      return acc;
    }, {})
    console.log(res);

    【讨论】:

      【解决方案3】:

      对于这种特殊情况,您可以这样做:

      const myObj = {
        245:[
              {id:"12",name:"test",status:"new"},
              {id:"15",name:"test2",status:"old"},
              {id:"12",name:"test2",status:"old"}
            ],
        2815:[
              {id:"19",name:"test",status:"new"},
              {id:"50",name:"test2",status:"old"},
              {id:"120",name:"test2",status:"new"}
             ]
      };
      
      const filteredObj = filterMyObj(myObj);
      console.log(filteredObj);
      
      function filterMyObj(myObj){
        const myObjCopy = {...myObj};
        for (const key in myObjCopy){
          const myArrCopy = [...myObjCopy[key]];
          myObjCopy[key] = myArrCopy.filter(item => item.status == "new");
        }
        return myObjCopy;
      }

      【讨论】:

        【解决方案4】:

        您可以使用filter 来做到这一点:

          for(let key in obj){
             obj[key] = obj[key].filter(el => el.status == "new")
          }
        

        【讨论】:

          猜你喜欢
          • 2019-01-21
          • 1970-01-01
          • 2016-08-16
          • 1970-01-01
          • 1970-01-01
          • 2013-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多