Как получить массив объектов во вложенном массиве массивов объектов javascript - PullRequest
0 голосов
/ 26 марта 2020

Я хотел бы знать, как получить объект массива во вложенном объекте массива, используя javascript. Ниже находится объект obj, который должен получить объект со статусом children1, имеющий Active и Updated.


var obj = [{
   "id": 1,
   "status":"updated",
   "code": "product",
   "children": [
     {
        "id" : 20,
      "title": "cafe",
      "children1": [
        {"id": "2", "title": "SG", "status": "Active"},
        {"id": "3", "title": "TH", "status": "Updated"},
        {"id": "4", "title": "MY", "status": "Deleted"}
      ]
     },
     {
        "id" : 21,
      "title": "others",
      "children1": [
        {"id": "5", "title": "tours", "status": "Active"},
        {"id": "6", "title": "services", "status": "Updated"},
        {"id": "7", "title": "finance", "status": "Deleted"}
      ]
     }
   ]
}]


function getActiveUpdtedObj (obj){
  var result = obj.filter(e=>e.children.filter(i=>i.children1.status !=="Deleted"));
  console.log(result);
}

this.getActiveUpdtedObj(obj);

Ожидаемый результат

[{
   "id": 1,
   "status":"updated",
   "code": "product",
   "children": [
     {
        "id" : 20,
      "title": "cafe",
      "children1": [
        {"id": "2", "title": "SG", "status": "Active"},
        {"id": "3", "title": "TH", "status": "Updated"}
      ]
     },
     {
        "id" : 21,
      "title": "others",
      "children1": [
        {"id": "5", "title": "tours", "status": "Active"},
        {"id": "6", "title": "services", "status": "Updated"}
      ]
     }
   ]
}]


Ответы [ 5 ]

1 голос
/ 26 марта 2020

ОБНОВЛЕНИЕ:

Итак, сначала вы перебираете массив obj (это массив, а не объект) с .map и возвращаете тот же текущий объект (используя оператор распространения {...o}) и переопределяющее свойство children с недавно отфильтрованным массивом children.

Теперь, как получить этот недавно отфильтрованный массив children?

Выполните еще одну итерацию с помощью .map on .children свойство вашего текущего объекта, получите доступ к каждому child 'children1 свойству и отфильтруйте его. Создайте и верните новый дочерний объект (опять же с оператором распространения), переопределив его свойство children1 вновь отфильтрованным массивом. Готово, теперь у вас есть новый массив children верхнего уровня.

obj.map(o => {
  const newChildren = o.children.map(child => {
    const newChildren1 = child.children1.filter(c => c.status !== 'Deleted');
    return { ...child, children1: newChildren1 };
  });

  return { ...o, children: newChildren }
});
0 голосов
/ 26 марта 2020

Я думаю, что лучшим методом было бы использование методов массива map () и filter (), как в этом коде

function getActiveUpdtedObj (obj){
  var result = obj.map(object => ({
    ...object,
    children: object.children.map(child => ({
       ...child,
       children1: child.children1.filter(child1 => child1.status !== 'Deleted')
    }))
  }));
  console.log(result);
}

Сообщите, помог ли ответ.

0 голосов
/ 26 марта 2020

Мы можем использовать map, filter и оператор покоя, чтобы получить желаемый результат:

const result = arr.map(({children, ...rest}) => ({...rest, 
  children: children.map(({children1, ...rest1 }) => ({ ...rest1, 
      children1: children1.filter(f => f.status == 'Active' 
          || f.status == 'Updated') }))}))

Пример:

let arr = [{
   "id": 1,
   "status": "updated",
   "code": "product",
   "children": [
      {
         "id": 20,
         "title": "cafe",
         "children1": [
            { "id": "2", "title": "SG", "status": "Active" },
            { "id": "3", "title": "TH", "status": "Updated" },
            { "id": "4", "title": "MY", "status": "Deleted" }
         ]
      },
      {
         "id": 21,
         "title": "others",
         "children1": [
            { "id": "5", "title": "tours", "status": "Active" },
            { "id": "6", "title": "services", "status": "Updated" },
            { "id": "7", "title": "finance", "status": "Deleted" }
         ]
      }
   ]
}]

const result = arr.map(({children, ...rest}) => ({...rest, children: children.map(({children1, ...rest1 }) =>
   ({ ...rest1, children1: children1.filter(f => f.status == 'Active' || f.status == 'Updated') }))}))
console.log(result);
0 голосов
/ 26 марта 2020

Вы можете изменить исходный объект, например:

var obj = [
  {
    id: 1,
    status: 'updated',
    code: 'product',
    children: [
      {
        id: 20,
        title: 'cafe',
        children1: [
          { id: '2', title: 'SG', status: 'Active' },
          { id: '3', title: 'TH', status: 'Updated' },
          { id: '4', title: 'MY', status: 'Deleted' },
        ],
      },
      {
        id: 21,
        title: 'others',
        children1: [
          { id: '5', title: 'tours', status: 'Active' },
          { id: '6', title: 'services', status: 'Updated' },
          { id: '7', title: 'finance', status: 'Deleted' },
        ],
      },
    ],
  },
];

for (const { children } of obj) {
  for (const child of children) {
    child.children1 = child.children1.filter(e => e.status !== 'Deleted');
  }
}
console.log(JSON.stringify(obj));
0 голосов
/ 26 марта 2020

Одним из возможных методов является следующий:

function getActiveUpdtedObj(obj) {
  var result = obj.map(e => {
    e.children = e.children.map(child => {
      child.children1 = child.children1.filter(c => c['status'] !== "Deleted");
      return child
    });
    return e
  });
}

на самом верхнем уровне, вы можете захотеть сделать map для самого объекта (то есть преобразовать каждый элемент), затем для каждого элемента, который вы хотите редактировать только свои children.children1 данные. На данный момент вам понадобится filter.

Примечания:

  • вы также можете сделать reduce, но это будет немного сложнее, D

  • вы можете оформить lodash библиотеку, это так хорошо для манипулирования коллекцией https://lodash.com/docs

...