Преобразование JSON в массив объектов с использованием lodash

Написание, если кому-то понадобится (работал для меня):

event.stopImmediatePropagation()

Из этого решения.

2
задан Kirti Jha 19 March 2019 в 11:52
поделиться

5 ответов

Вы можете использовать split(), чтобы разбить значения в массив. Затем выполните итерацию по массиву и создайте требуемый json, а затем вставьте его в результаты.

Проверьте это.

var data = {
    "BPContName":"aName;bName;cName",
    "BPContEmail":"aEmail;bEmail;cEmail",
    "BPContPWID":"aPWID;bPWID;cPWID"
}
var names = data.BPContName.split(';');
var emails = data.BPContEmail.split(';');
var pwids = data.BPContPWID.split(';');

var results = [];

for(var i = 0 ; i < names.length; i++) {
  var obj = {
    name: names[i],
    email: emails[i],
    pwdid: pwids[i]
  }
  results.push(obj);
}

console.log(results)

0
ответ дан ivp 19 March 2019 в 11:52
поделиться

Попробуйте следующий код -

o = {
  "BPContName": "aName;bName;cName",
  "BPContEmail": "aEmail;bEmail;cEmail",
  "BPContPWID": "aPWID;bPWID;cPWID"
}

map = { "BPContName" : "name", "BPContEmail": "email", "BPContPWID": "pwdid" }

const result = _.reduce(o, (arr, v, k) => ( v.split(";").forEach((x,i) => _.set(arr, `${i}.${map[k]}`, x)), arr ), [])
   
console.log(result)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>

0
ответ дан Yasser Hussain 19 March 2019 в 11:52
поделиться

Вы можете reduce записи, возвращаемые Object.entries , например:

let obj = {
  "BPContName": "aName;bName;cName",
  "BPContEmail": "aEmail;bEmail;cEmail",
  "BPContPWID": "aPWID;bPWID;cPWID"
}

let bpTableDataName = Object.entries(obj).reduce((r, [key, value]) => {
  let splits = value.split(";");
  key = key.replace("BPCont", "").toLowerCase();
  splits.forEach((split, i) => (r[i] = r[i] || {})[key] = split)
  return r;
}, [])

obj.bpTableDataName = bpTableDataName;

console.log(obj)
[1116 ]

  • Object.entries возвращает массив пары ключ-значение. Прокрутите каждую из них
  • split Каждое значение в ;
  • получите ключ, удалив часть BPCont и сделав ее lowerCase
  • Проходной splits и обновлять определенные ключи объектов в каждом индексе

Обновление:

Поскольку у вас есть дополнительный d в ключе вывода, вы можете создать объект отображения:

propertyMap = {
  "BPContName": "name",
  "BPContEmail": "email",
  "BPContPWID": "pwdid"
}

А внутри reduce измените код replace на этот:

key = propertyMap[key]
0
ответ дан adiga 19 March 2019 в 11:52
поделиться

Вы можете использовать lodash _.flow() для создания функции. Используйте _.map() с _.overArgs() для создания функции, которая разделяет значения, форматирует ключ и затем преобразует их в массив пар, используя _.unzip(), например [['name', 'x'], ['name', 'y']]. Транспонировать массив массивов с помощью _.unzip(), чтобы объединить пары разных свойств. Затем используйте _.map() для итерации и преобразуйте каждый массив пар в объект, используя _.fromPairs().

const { flow, partialRight: pr, map, unzip, overArgs, times, size, constant, split, fromPairs } = _

const keysMap = new Map([['BPContName', 'name'], ['BPContEmail', 'email'], ['BPContPWID', 'pwdid']])

const formatKey = key => keysMap.get(key)
const splitVals = pr(split, ';')

const fn = flow(
  pr(map, overArgs(
    (vals, k) => unzip([vals, times(size(vals), constant(k))]),
    [splitVals, formatKey])
  ),
  unzip, // transpose
  pr(map, fromPairs) // convert each pairs array to object
)

const data = {
    "BPContName":"aName;bName;cName",
    "BPContEmail":"aEmail;bEmail;cEmail",
    "BPContPWID":"aPWID;bPWID;cPWID"
}

const results = fn(data)

console.log(results)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

0
ответ дан Ori Drori 19 March 2019 в 11:52
поделиться

В основном, вам нужно zip это.

Фрагмент:

let obj = {"BPContName":"aName;bName;cName","BPContEmail":"aEmail;bEmail;cEmail","BPContPWID":"aPWID;bPWID;cPWID"},
    res = _.zipWith(
      ..._.map(obj, v => v.split(';')),
      (name, email, pwid) => ({name, email, pwid})
    );
    
console.log(res)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Обратите внимание, последовательность параметров мы должны поставить таким образом, исходный объект дает нам значения при использовании Object.values или дает нам ключи при использовании Object.keys обычно в алфавитном порядке. Но, в случае, если в любом env порядке порядок не гарантирован, мы можем отсортировать его с помощью последовательности ключей в качестве метаданных.

Или вы можете явно передать аргументы, например:

(obj.BPContName.split(';'), obj.BPContEmail.split(';'), obj.BPContPWID.split(';'))
0
ответ дан Koushik Chatterjee 19 March 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: