Разделите один объект на несколько объектов - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть один объект JSON, который я хотел бы разделить на несколько объектов.Я попытался преобразовать один объект JSON в массив.Я не мог придумать, как разбить один объект, если есть отсутствующий ключ, например, food1, food2 и т. Д. Я даже не уверен, что это лучший подход.Я ценю любую помощь или указатели в правильном направлении!

До

{
  "fullName1" : "John Doe",
  "attendance1" : 1,
  "meal1" : "salmon",
  "fullName2" : "Jane Doe",
  "attendance2" : 0
}

Желаемый результат

{
  "fullName" : "John Doe",
  "attendance" : 1,
  "meal" : "salmon"
},
{
  "fullName" : "Jane Doe"
  "attendance" : 0
}

Что касается моей попытки, это то, как далеко яВы получили:

const entries = [...elements];
// check for valid elements
const isValidElement = element => {
  return element.name && element.value;
};
const isValidValue = element => {
  return (!['radio'].includes(element.type) || element.checked);
};
const formToJSON = elements =>
  [].reduce.call(elements, (data, element) => {
    if (isValidElement(element) && isValidValue(element)) {
      data[element.name] = element.value;
    }
    return data;
  }, {});
//
const singleArray = formToJSON(entries);

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы можете использовать Object.entries и reduce, как показано ниже, чтобы достичь этого

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

let obj = {
  "fullName1" : "John Doe",
  "attendance1" : 1,
  "meal1" : "salmon",
  "fullName2" : "Jane Doe",
  "attendance2" : 0
}

let res = Object.entries(obj).reduce((o, [k, v]) => {
    let [name, number] = k.match(/\D+|\d+$/g)
    o[number] = { ...(o[number] || {}), [name]: v }
    return o
  }, {})
  
console.log(Object.values(res))
0 голосов
/ 20 ноября 2018

Не зная, сколько будет объектов, лучше всего разбить их на массив объектов.Сначала переберите ключи, затем проверьте их индекс.Предполагается, что ключи ВСЕГДА оканчиваются цифрой, а число в конце всегда является индексом.

var obj = {
  "fullName1" : "John Doe",
  "attendance1" : 1,
  "meal1" : "salmon",
  "fullName2" : "Jane Doe",
  "attendance2" : 0
};
var objs = [];
Object.keys(obj).forEach(function(key) {
  var match = key.match(/(.*)(\d.*)$/);
  var newKey = match[1];
  var index = parseInt(match[2]) - 1;
  objs[index] = objs[index] || {};
  objs[index][newKey] = obj[key];
})
console.log(objs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...