#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
функции:
- Создайте объект со всеми полями, которые не связаны со значениями, вычисляемыми
comb
функцией. - Выполните
comb
функцию. - Выполните итерацию по полученным значениям, используя объект, созданный на шаге первом, в качестве шаблона (клонируя его) и используйте индекс значения, которое вы перебираете, чтобы узнать, на что
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. Окей, я думаю, это обновление решит вашу проблему 🙂