Фильтрация данных JSON с использованием javaScript [закрыта]

B.V.S Bharat Kumar спросил: 28 марта 2018 в 03:05 в: javascript

Я назначил задачу для группировки данных в угловых js с использованием подчеркивания js.

My JSON:

 data = [   
        {
          "Building*": "Building A",
          "Wing*": "Wing C",
          "Floor*": "Floor 3",
          "Room Name*": "Room 3",
          "Room Type*": "AC",
          "Location*": "Location 1",
          "Device ID*": 27,
          "Category*": "Soap Hygene",
          "Dispenser Name*": "Dispenser 34",
          "Type*": "Manual",
          "Cartridge Type*": "Type 1",
          "Date of installation": "2016-04-11T06:06:22 -06:-30",
          "Contact Last Name": "Maynard",
          "Email Address": "thomas.boscher@gmail.com",
          "Mobile Number with country code": "+1 (949) 590-3465",
          "Description": "Description of device",
          "Model": 37
        },
        {
          "Building*": "Building B",
          "Wing*": "Wing B",
          "Floor*": "Floor 3",
          "Room Name*": "Room 1",
          "Room Type*": "AC",
          "Location*": "Location 3",
          "Device ID*": 26,
          "Category*": "Soap Hygene",
          "Dispenser Name*": "Dispenser 33",
          "Type*": "Manual",
          "Cartridge Type*": "Type 2",
          "Date of installation": "2015-07-24T12:42:24 -06:-30",
          "Contact Last Name": "Holland",
          "Email Address": "thomas.boscher@gmail.com",
          "Mobile Number with country code": "+1 (947) 491-2353",
          "Description": "Description of device",
          "Model": 32
        }               ]

Мне нужны данные ниже формат, где у него есть все детали здания, содержащие данные о крыле и полу.

  updateData = [{ 
    building: 'Building A' , 
    buildingData:[ {
        wing: "Wing A",
         wingData: [{
          floor:'Floor 2',
          floorData:[{
            room:'Room 3',
            roomData:[]
            }]
          }]
        }]
  }];

Я пробовал:

js fiddle

Но это терпит неудачу. Нужна помощь. Спасибо заранее.


1 ответ

Есть решение
Warren Wan ответил: 28 марта 2018 в 04:08

Насколько я понимаю, вы хотите группироватьBy в следующем вложенном порядке:

Building - > > Крыло - > > Этаж - > > Room

Вы можете попытаться вызвать groupBy рекурсивно (или перебрать до вас), передав массив порядка вложенного атрибута, который вы хотите groupBy. Попробуйте этот фрагмент ниже:

const nestedOrder = ['Building*', 'Wing*', 'Floor*', 'Room Name*']function groupFilter (rawData, attrList) {
  if (attrList.length == 0) return rawData  var currentAttr = _(attrList).first()
  return _(rawData)
    .chain()
    .groupBy(currentAttr)
    .map((list, attrName) => Object({
      [currentAttr]: attrName,
      [`${currentAttr}Data`]: groupFilter(list, _(attrList).rest())
    }))
    .value()
}console.log(groupFilter(data, nestedOrder))

Затем необработанные данные будут сжаты до самого глубокого вложенного атрибута, в этом случае 'Room Name', затем вы можете написать свой собственный фильтр для вывода что вы хотите, чтобы RoomData держал.

Не уверен, что это правильный способ сделать это, но если время выполнения не является для вас большой проблемой, то я думаю, вы можете заставить его работать нормально.

Надеюсь, это поможет / сработает для вас.