извлечь значения объекта и вставить в строку в точных позициях - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть следующее JSON описание заголовков столбцов, которые я хотел бы извлечь и поместить в правильную 'позицию' в массиве строк

header = {
          "columns": {
             "col1": {
               "label": [ "Col1Row1", "Col1Row2" ],
               "width": 12,
               "position" : 10
            },
             "col2": {
               "label": ["Col2Row1", "Col2Row2", "Col2Row3"],
               "width": 9,
               "position" : 23
            }
        }

с таким массивом, который выглядит так, где Col1 находится в 10 позиции, а Col2 в 23 позиции:

header[0] = '          Col1Row1     Col2Row1        '
header[1] = '          Col1Row2     Col2Row2        '
header[2] = '                       Col2Row3        '

Я пробовал несколько раз, но сгенерировал невероятно подробный код, используя .slice, .substr, .concat, et c. Я не могу придумать краткий способ изменить содержание. Я что-то упускаю из виду?

1 Ответ

1 голос
/ 10 февраля 2020

Перебирайте столбцы cols один за другим, добавляя пробелы к каждой строке, пока в них не будет достаточно символов, чтобы соответствовать position (вы можете сделать это кратко, вызвав padEnd с пробелом), затем добавьте метку :

const header = {
  "columns": {
     "col1": {
       "label": [ "Col1Row1", "Col1Row2" ],
       "width": 12,
       "position" : 10
    },
     "col2": {
       "label": ["Col2Row1", "Col2Row2", "Col2Row3"],
       "width": 9,
       "position" : 23
    }
  }
};
const arr = [];
for (const { label, position } of Object.values(header.columns)) {
  label.forEach((labelStr, i) => {
    arr[i] = (arr[i] || '').padEnd(position, ' ') + labelStr;
  });
}
console.log(arr);

Хотя они и есть в вашем примере, если столбцы не упорядочены, вам придется сначала отсортировать их:

const header = {
  "columns": {
     "col1": {
       "label": [ "Col1Row1", "Col1Row2" ],
       "width": 12,
       "position" : 10
    },
     "col2": {
       "label": ["Col2Row1", "Col2Row2", "Col2Row3"],
       "width": 9,
       "position" : 23
    }
  }
};
const arr = [];
for (const { label, position } of Object.values(header.columns).sort((a, b) => a.position - b.position)) {
  label.forEach((labelStr, i) => {
    arr[i] = (arr[i] || '').padEnd(position, ' ') + labelStr;
  });
}
console.log(arr);

Хотя это не проблема для вашего примера, если какая-либо из меток слишком велика для размещения в столбце, отрежьте конец последнего arr[i] :

const header = {
  "columns": {
     "col1": {
       "label": [ "Col1Row1xxxxxxxxxxxxxxxxxxxxxxx", "Col1Row2" ],
       "width": 12,
       "position" : 10
    },
     "col2": {
       "label": ["Col2Row1", "Col2Row2", "Col2Row3"],
       "width": 9,
       "position" : 23
    }
  }
};
const arr = [];
for (const { label, position } of Object.values(header.columns).sort((a, b) => a.position - b.position)) {
  label.forEach((labelStr, i) => {
    arr[i] = (arr[i] || '').slice(0, position - 1).padEnd(position, ' ') + labelStr;
  });
}
console.log(arr);

(если вы хотите, чтобы метки были такими, если вы хотите, чтобы между метками в этой ситуации был один пробел. Если вы хотите настроить интервал, измените параметр position - 1 до .slice)

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