Форматирование данных и удаление ключей - PullRequest
1 голос
/ 09 июня 2019

У меня есть еще один вопрос с данными.Обработка данных - это мое слабое место, поэтому я пытаюсь понять это лучше.У меня есть переменная с именем data, которая содержит следующие

[
    {"ID":1,"process":"quick","owner":"John","decission":"Admin","status":"failed","flag":"red"},
    {"ID":2,"process":"standard","owner":"Mary","decission":"Admin","status":"failed","flag":"blue"},
    {"ID":3,"process":"slow","owner":"John","decission":"Management","status":"active","flag":"red"}
]

По сути, это массив объектов.Я пытаюсь превратить это в массив, в котором ключи объектов являются первой строкой массива, а содержимое следует за ним.
Однако мне не требуется идентификатор или флаг.Таким образом, приведенное выше будет выглядеть примерно так:

[
    ["process","owner","decission","status"],
    ["quick","John","Admin","failed"],
    ["standard","Mary","Admin","failed"],
    ["slow","John","Management","active"]
]

Итак, чтобы получить строку заголовка, я подумал о том, чтобы сделать что-то вроде этого

const keys = Object.keys(this.data[0]);
keys.splice(keys.indexOf('ID'), 1);
keys.splice(keys.indexOf('flag'), 1);
this.formattedArray.push(keys);

Однако мне кажется, что это очень важный шагпошаговый процесс, а затем, как я могу убедиться, что другие данные размещены в правильных строках внизу?

Как лучше всего отформатировать исходные данные так, как мне сейчас требуется?

Спасибо

Ответы [ 4 ]

2 голосов
/ 09 июня 2019

Сначала получите ключи, затем значения, основанные на этих ключах.

const data = [{"ID":1,"process":"quick","owner":"John","decission":"Admin","status":"failed","flag":"red"},{"ID":2,"process":"standard","owner":"Mary","decission":"Admin","status":"failed","flag":"blue"},{"ID":3,"process":"slow","owner":"John","decission":"Management","status":"active","flag":"red"}];
const keys = Object.keys(data[0]).filter(e => !(["ID", "flag"].includes(e)));
const values = data.map(e => Object.entries(e).filter(([k]) => keys.includes(k)).map(([, v]) => v));
const res = [keys, ...values];
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
1 голос
/ 09 июня 2019

Пока другие решения работают.Я бы сделал

const excludeItems = new Set(["ID", "flag"]);

function generateTableData(data) {
  const headers = Object.keys(data[0]).filter(item => !excludeItems.has(item));
  const items = data.map(item =>
    Object.entries(item).reduce((res, [key, value]) => {
      if (!excludeItems.has(key)) {
        res.push(value);
      }
      return res;
    }, [])
  );
  return [headers, ...items];
}

проверить это здесь

1 голос
/ 09 июня 2019

Вот еще один способ сделать это, используя Array.prototype.reduce

const result = this.data.reduce((accumulator, currentValue) => {
    if (accumulator && accumulator.length === 0) {
        const headers = Object.keys(currentValue).filter((key) => key !== 'ID' && key !== 'flag');
        accumulator.push(headers);
    }
    accumulator.push(Object.values(currentValue).slice(1));
    return accumulator;
}, []);
1 голос
/ 09 июня 2019

Поскольку я вижу, что у вас нет массива всех ваших заголовков, вы можете создать его с помощью:

const headers = Object.keys(data[0]).filter(header => header !== 'ID');

После того, как у вас есть все ваши заголовки, вы можете продолжить и извлечь данные:

const data = [
    {"ID":1,"process":"quick","owner":"John","decission":"Admin","status":"failed","flag":"red"},
    {"ID":2,"process":"standard","owner":"Mary","decission":"Admin","status":"failed","flag":"blue"},
    {"ID":3,"process":"slow","owner":"John","decission":"Management","status":"active","flag":"red"}
];

const headers = Object.keys(data[0]).filter(header => header !== 'ID');
const result = [headers];
data.forEach(row => result.push(headers.map(header => row[header])));

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