как изменить структуру вывода

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Это начало объекта. Я должен быть в состоянии получить элементы celldata.values .

     var generatedObj1 = {
      "agg": "Glossar",
      "ifa": null,
      "ifv": null,
      "ird": null,
      "afv": null,
      "ard": null,
      "metaData": {
        "cellMetaDataList": [{
          "cell": "glossar", // <-- cell type 
          "cmv": null,
          "crd": null,
          "logicalData": {
            "body": [{
                "id": "f5d", // <-- body id 1
                "name": "name", // <-- attribute name 1
                "minLength": 3,
                "maxLength": 100,
                "minValue": null,
                "maxValue": null,
                "wertebereich": "ALPHANUMERISCH",
                "validationCode": "",
                "exampleValues": ["Langer Name", "Kurzer Name", "Kein Name"]
              },
              {
                "id": "42", // <-- body id 2
                "name": "kurzname", // <-- attribute name 2
                "minLength": 3,
                "maxLength": 20,
                "minValue": null,
                "maxValue": null,
                "wertebereich": "ALPHANUMERISCH",
                "validationCode": "",
                "exampleValues": ["long_desc", "short_desc", "no_desc"]
              },
              {
                "id": "9d", // <-- body id 3
                "name": "eindeutig", // <-- attribute name 3
                "minLength": 1,
                "maxLength": 1,
                "minValue": null,
                "maxValue": null,
                "wertebereich": "WAHRHEITSWERT",
                "validationCode": "",
                "exampleValues": [true, false]
              }
            ]
          }
        }]
      },
      "data": {
        "cellData": [{ // row 1 from res1
            "cell": "glossar", // <-- cell type 
            "id": "5b", // <- UUID v4 (generated by the function)
            "cmv": null,
            "crd": null,
            "caption": {
              "pers": "string",
              "custNr": "string",
              "fnam": "string",
              "snam": "string",
              "sysId": "string"
            },
            "values": [{
                "name": "name", // <-- attribute name 1
                "value": "Langer Name",
                "bodyRefId": "5d" // <-- body id 1
              },
              {
                "name": "kurzname", // <-- attribute name 2
                "value": "no_desc",
                "bodyRefId": "42" // <-- body id 2
              },
              {
                "name": "eindeutig", // <-- attribute name 3
                "value": false,
                "bodyRefId": "9d" // <-- body id 3
              }
            ]
          },
          { // row 2 from res1
            "cell": "glossar", // <-- cell type 
            "id": "5c", // <- UUID v4 (generated by the function)
            "cmv": null,
            "crd": null,
            "caption": {
              "pers": "string",
              "custNr": "string",
              "fnam": "string",
              "snam": "string",
              "sysId": "string"
            },
            "values": [{
                "name": "name", // <-- attribute name 1
                "value": "Kein Name",
                "bodyRefId": "5d" // <-- body id 1
              },
              {
                "name": "kurzname", // <-- attribute name 2
                "value": "short_desc",
                "bodyRefId": "42" // <-- body id 2
              },
              {
                "name": "eindeutig", // <-- attribute name 3
                "value": true,
                "bodyRefId": "9d" // <-- body id 3
              }
            ]
          },
          { // row 3 from res1
            "cell": "glossar", // <-- cell type 
            "id": "5d", // <- UUID v4 (generated by the function)
            "cmv": null,
            "crd": null,
            "caption": {
              "pers": "string",
              "custNr": "string",
              "fnam": "string",
              "snam": "string",
              "sysId": "string"
            },
            "values": [{
                "name": "name", // <-- attribute name 1
                "value": "Kurzer Name",
                "bodyRefId": "5d" // <-- body id 1
              },
              {
                "name": "kurzname", // <-- attribute name 2
                "value": "short_desc",
                "bodyRefId": "42" // <-- body id 2
              },
              {
                "name": "eindeutig", // <-- attribute name 3
                "value": true,
                "bodyRefId": "9d" // <-- body id 3
              }
            ]
          }
        ]
      }
    }
  

Цитата из блока

возвращаемый массив должен быть преобразован в соответствии с метаданными. Каждая запись в массиве описывает объект в результирующем объекте. и должен быть в состоянии изменить реализацию требования в функции ниже.

      function add(input1) {
        let exampleValues1 = input1.metaData.cellMetaDataList[0].logicalData.body.map(({
          exampleValues
        }) => exampleValues);

        return comb(exampleValues1,20);
      }
  

комбинированная функция .

  function comb(args,output) {
var combination = [], max = args.length-1;
function helper(arr, i) {
    for (var j=0, l=args[i].length; j<l; j  ) {
        var a = arr.slice(0); // clone arr
        a.push(args[i][j]);
        if (i==max)
            combination.push(a);
        else
            helper(a, i 1);
    }
}
helper([], 0);
while(combination.length < output){
combination = combination.concat(combination)}
return combination.sort(function() {
  return .5 - Math.random();
}).slice(0,output); }
 console.log(add(generatedObj1)); 
  

Пример результата:

  [["Langer Name", "no_desc", false],
   ["Kein Name", "short_desc", true]
   ["Kurzer Name", "short_desc", true]
     ];
  
  

возвращаемый массив должен быть преобразован в соответствии с метаданными.
Каждая запись в массиве описывает объект в результирующем объекте.

Вы все еще можете просто вызвать функцию add и получить свой ввод с ее помощью Ввод вообще не меняется, мы просто меняем вывод … (вот почему билет называется адаптацией структуры вывода)

Для каждой строки, отображаемой в выходных данных функции comb, функция add должна создать один объект в элементе cellData. Он должен иметь тип ячейки, идентификатор, нулевое значение cmv и crd, а также объект заголовка, что наиболее важно, он должен иметь массив значений, содержащий объект с именем атрибута (из body.name ) возвращаемое значение (из массива comb) и идентификатор bodyRefId (из body.id )

Как я могу реализовать это в своей функции add() ?

Комментарии:

1. map возвращает массив, и что возвращает comb() функция? Также вы пытаетесь деструктурировать exampleValues как объект, когда он является массивом.

2. comb — это еще одна функция, которая используется для объединения массива, то есть значений примера. ДА.

Ответ №1:

Вы можете создать объект из массива, заполнив поля объекта, используя обозначения в квадратных скобках. Метод будет выглядеть следующим образом:

 function mapArrayToObject(cellDataValues) {
    const obj = {};
    cellDataValues.forEach(element => {
        const fieldName = element[0];
        const fieldValue = element[2];
        obj[fieldName] = fieldValue;
    });
    return obj;
}
  

Обновление 17.09.2020 (Вопрос был неправильно понят)

После тщательного изучения вашего вопроса я предполагаю, что ваша цель следующая: после выполнения функции add вы хотите получить объект с некоторыми полями ( id , cell , caption …) и values поле, которое содержит значения, вычисленные comb функцией, но проанализированные на объекты, которые содержат информацию о body .

Для достижения этого я предлагаю решение, разделенное на 3 этапа внутри add функции:

  1. Создайте объект со всеми полями, которые не связаны со значениями, вычисляемыми comb функцией.
  2. Выполните comb функцию.
  3. Выполните итерацию по полученным значениям, используя объект, созданный на шаге первом, в качестве шаблона (клонируя его) и используйте индекс значения, которое вы перебираете, чтобы узнать, на что body вы указываете, чтобы получить name и bodyRefId для каждого значения.

Реализация была бы:

 function add(input1) {

    // FIRST STEP: Creating the template object
    const metaData = input1.metaData.cellMetaDataList[0];
    const bodies = metaData.logicalData.body;
    let emptyObj = {
        id: "ID GENERATED BY THE FUNCTION",
        cell: metaData.cell,
        cmv: null,
        crd: null,
        caption: {
            "pers": "string",
            "custNr": "string",
            "fnam": "string",
            "snam": "string",
            "sysId": "string"
        }
    };

    // SECOND STEP: Calling to the comb function
    let exampleValues1 = bodies.map(({ exampleValues }) => exampleValues);
    const valuesArr =  comb(exampleValues1,20);

    // THIRD STEP: Parsing (Tricky part)
    // Iterating through each collection of values -> [], [], []
    const valuesObj = valuesArr.map(arr => {

        // Cloning the template object
        const obj = { ...emptyObj };

        // Iterating through each value -> 'val1', 'val2', 'val3'
        const valuesArr = arr.map((value, index) => {
            // Using the index in order to know the body.
            // For example, when index is 0 we know that we can get the name from bodies[0]
            return {
                name: bodies[index].name,
                value: value,
                bodyRefId: bodies[index].id
            }
        })

        // Assigning the parsed values to the cloned template object
        obj.values = valuesArr;

        // Returning the object as we are using the map function
        return obj;
    });

    // Now, valuesObj should have the expected structure
    return valuesObj;
}
  

Комментарии:

1. Это изменение может быть реализовано как часть функции add, поскольку здесь доступны объединенный массив и исходный объект. но как я могу реализовать это в моей функции добавления?

2. и я не хочу использовать какую-либо библиотеку.

3. Окей, я думаю, это обновление решит вашу проблему 🙂