Реструктурировать данные объекта, когда ключ объекта присутствует в массиве другого объекта в JavaScript - PullRequest
3 голосов
/ 04 ноября 2019

У меня есть объект data , который имеет такие свойства, как "имя", "дата" и т. Д.

const data = {
    "name":{
      "columnName":"name",
      "columnType":"name of employee",
      "values":[
        "sam", "son"
      ],
      "range":{
        "min":0,
        "max":0
      }
    },
    "date":{
      "columnName":"date",
      "columnType":"date input",
      "categoricalValues":[
      ],
      "range":{
        "min":0,
        "max":0
      }
    },
    "fare":{
      "columnName":"fare",
      "columnType":"fare indication",
      "values":[
        "false",
        "true"
      ],
      "range":{
        "min":0,
        "max":0
      }
    },
    "id":{
      "columnName":"id",
      "columnType":"id employee",
      "values":[
      ],
      "range":{
        "min":0,
        "max":0
      }
    }
}

Другой объект categoryoricalColumns , который имеет некоторые свойства, которые содержатмассив, в котором указаны все имена свойств предыдущего объекта

const categoricalColumns = 
  { 
    "Charges" : ["name" , "fare"],
    "Location" : ["date", "address" ]
  }

Если свойства объекта data , скажем, "name" и "flare" присутствуют внутри categoryoricalColumns"сборы", мне нужно реструктурировать объект категориального столбца в этом формате

{
    "title" : "Charges",
    "children" : [
      {
        "name":{
          "columnName":"name",
          "columnType":"name of employee",
          "values":[
            "sam", "son"
          ],
          "range":{
            "min":0,
            "max":0
          }
        }
      },
      {
        "fare":{
          "columnName":"fare",
          "columnType":"fare indication",
          "values":[
            "false",
            "true"
          ],
          "range":{
            "min":0,
            "max":0
          }
        }
      }
    ]
  }

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

const result = [
  {
    "title" : "Charges",
    "children" : [
      {
        "name":{
          "columnName":"name",
          "columnType":"name of employee",
          "values":[
            "sam", "son"
          ],
          "range":{
            "min":0,
            "max":0
          }
        }
      },
      {
        "fare":{
          "columnName":"fare",
          "columnType":"fare indication",
          "values":[
            "false",
            "true"
          ],
          "range":{
            "min":0,
            "max":0
          }
        }
      }
    ]
  },
  {
    "title" : "Location",
    "children" : [
      {
        "date":{
          "columnName":"date",
          "columnType":"date input",
          "categoricalValues":[
          ],
          "range":{
            "min":0,
            "max":0
          }
        }
      }
    ]
  },
  {
    title : "Others",
    "children" : [
      {
        "id":{
          "columnName":"id",
          "columnType":"id employee",
          "values":[
          ],
          "range":{
            "min":0,
            "max":0
          }
        }
      }
    ]
  }
]

если какое-либо свойство data не соответствует ни одному из категорических столбцов , оно должно быть в дочерних элементах свойства "Другие".

Ответы [ 3 ]

2 голосов
/ 04 ноября 2019

Вы можете взять Set и удалить посещенные столбцы.

function restructure(data, categories) {
    var others = new Set(Object.keys(data));

    return Object
        .entries(categories)
        .reduce((r, [title, category]) => {
            var children = category.filter(k => k in data).map(k => ({ [k]: data[k] }));
            if (children.length) r.push({ title, children });
            category.forEach(Set.prototype.delete, others);
            return r;
        }, [])
        .concat(others.size
            ? { title: 'Others', children: Array.from(others, k => ({ [k]: data[k] })) }
            : []
        );
}


var data = { name: { columnName: "name", columnType: "name of employee", values: ["sam", "son"], range: { min: 0, max: 0 } }, date: { columnName: "date", columnType: "date input", categoricalValues: [], range: { min: 0, max: 0 } }, fare: { columnName: "fare", columnType: "fare indication", values: ["false", "true"], range: { min: 0, max: 0 } }, id: { columnName: "id", columnType: "id employee", values: [], range: { min: 0, max: 0 } } },
    categoricalColumns = { Charges: ["name", "fare"], Location: ["date", "address"] },
    result = restructure(data, categoricalColumns);

   console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 04 ноября 2019
let newCategorial = [{title: 'Others', children: []}];
let index;
Object.keys(data).forEach( dataKey => {
index = '';
  for(categorialKey in Object.keys(categorialColumns)) {
     index = categorialColumns[categorialKey].indexOf(dataKey);
     if(index != -1){
       newCatIndex = newCategorial.findIndex( obj => obj.title === categorialKey);
       newCatIndex === -1? newCategorial[categorialKey].push({ title: categorialKey, children: data[dataKey]) : newCategorial[categorialKey].children.push(data[dataKey]);
     }      
  }
  if(index == -1)
     newCategorial['Others'].push(data[dataKey]);
}
1 голос
/ 04 ноября 2019

const data = {
        "name": {
            "columnName": "name",
            "columnType": "name of employee",
            "values": [
                "sam", "son"
            ],
            "range": {
                "min": 0,
                "max": 0
            }
        },
        "date": {
            "columnName": "date",
            "columnType": "date input",
            "categoricalValues": [
            ],
            "range": {
                "min": 0,
                "max": 0
            }
        },
        "fare": {
            "columnName": "fare",
            "columnType": "fare indication",
            "values": [
                "false",
                "true"
            ],
            "range": {
                "min": 0,
                "max": 0
            }
        },
        "id": {
            "columnName": "id",
            "columnType": "id employee",
            "values": [
            ],
            "range": {
                "min": 0,
                "max": 0
            }
        }
    }
    const categoricalColumns = {
        "Charges": ["name", "fare"],
        "Location": ["date", "address"]
    }

    let result_obj = {};
    
    // add data elements to result_obj according to categoricalColumns:
    for (let j in data) {
        for (let k in categoricalColumns) {
            if (categoricalColumns[k].indexOf(j) > -1) {
                if (typeof result_obj[k] == 'undefined') {
                    result_obj[k] = [];
                }
                let obj = {};
                obj[data[j].columnName] = data[j];
                result_obj[k].push(obj);
                delete data[j];
                break;
            }
        }
    }
    // add remaining elements to "Others" category:
    for (let j in data) {
        if (typeof result_obj['Others'] == 'undefined') {
            result_obj['Others'] = [];
        }
        let obj = {};
        obj[data[j].columnName] = data[j];
        result_obj['Others'].push(obj);
        delete data[j];
    }
    // create result array from result_obj
    let result = [];
    for (let j in result_obj) {
        result.push({
            "title": j,
            "children": result_obj[j]
        });
    }

    console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...