Расширенный фильтр объекта в js - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь отфильтровать объект массивов с помощью объекта, но я понятия не имею, что я могу сделать. Пример:

{
  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"
  }]
}

Ответы [ 4 ]

1 голос
/ 15 апреля 2020

L oop поверх записей и создайте новый объект с отфильтрованными значениями

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)]))
}
0 голосов
/ 15 апреля 2020

вы можете сделать это для этого конкретного c случая, например:

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;
}
0 голосов
/ 15 апреля 2020

Вам необходимо отобразить ключи объекта и затем элементы массива, чтобы отфильтровать окончательный результат

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);
0 голосов
/ 15 апреля 2020

Вы можете сделать это с помощью filter:

  for(let key in obj){
     obj[key] = obj[key].filter(el => el.status == "new")
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...