Как преобразовать в многомерный массив в angularjs - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужна помощь для преобразования массива JSON в многомерный массив, я все время застреваю.

Я также пробовал использовать _.groupBy в underscore.js, но он не работает для вложенного массива.

Если возможно, конвертировать из следующего

[{
  "subject": "physics",
  "student_id": "2569",
  "values": "0.152,0.228,0.218"
}, {
  "subject": "maths",
  "student_id": "1236",
  "values": "0.146,0.22,0.212"
}, {
  "subject": "chemistry",
  "student_id": "4569",
  "values": "0.159,0.234,0.224"
}, {
  "subject": "physics",
  "student_id": "1478",
  "values": "0.16,0.235,0.225"
}]

Ожидаемый результат должен быть

{ 'physics': {
    '2569': "0.152,0.228,0.218",
    '1478': "0.16,0.235,0.225"
},
'maths': {
    '1236': "0.146,0.22,0.212"
},
'chemistry': {
    '4569': "0.159,0.234,0.224"
} }

Пожалуйста, предоставьте мнепростое решение.

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

Вы можете решить эту проблему кратко через Array.reduce и некоторые ES6 деструктурирование:

const data = [{ "subject": "physics", "student_id": "2569", "values": "0.152,0.228,0.218" }, { "subject": "maths", "student_id": "1236", "values": "0.146,0.22,0.212" }, { "subject": "chemistry", "student_id": "4569", "values": "0.159,0.234,0.224" }, { "subject": "physics", "student_id": "1478", "values": "0.16,0.235,0.225" }]

const result = data.reduce((a, {subject, student_id, values}) => {
  a[subject] = a[subject] || {}
  a[subject][student_id] = values
  return a
}, {})

console.log(result)
0 голосов
/ 10 декабря 2018

Вы можете использовать lodash's _.setWith() (для принудительного создания объекта для цифровых клавиш) с Array.reduce():

const data = [{"subject":"physics","student_id":"2569","values":"0.152,0.228,0.218"},{"subject":"maths","student_id":"1236","values":"0.146,0.22,0.212"},{"subject":"chemistry","student_id":"4569","values":"0.159,0.234,0.224"},{"subject":"physics","student_id":"1478","values":"0.16,0.235,0.225"}];

const fn = arr =>
  arr.reduce((r, o) => 
    _.setWith(r, [o.subject, o.student_id], o.values, Object)
  , {});

const result = fn(data);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 10 декабря 2018

const list = [{
  "subject": "physics",
  "student_id": "2569",
  "values": "0.152,0.228,0.218"
}, {
  "subject": "mathss",
  "student_id": "1236",
  "values": "0.146,0.22,0.212"
}, {
  "subject": "chemistry",
  "student_id": "4569",
  "values": "0.159,0.234,0.224"
}, {
  "subject": "physics",
  "student_id": "1478",
  "values": "0.16,0.235,0.225"
}]
reduction  = {}
list.map((a, b) => {
	if(reduction[a.subject])
		reduction[a.subject][a.student_id] = a.values;
	else
		reduction[a.subject] = {[a.student_id] : a.values};
	return reduction;
})
console.log(reduction);
0 голосов
/ 10 декабря 2018

Похоже, вы хотите изменить массив в объект. Array.prototype.reduce ваш друг для этого.

const list = [{
  "subject": "physics",
  "student_id": "2569",
  "values": "0.152,0.228,0.218"
}, {
  "subject": "maths",
  "student_id": "1236",
  "values": "0.146,0.22,0.212"
}, {
  "subject": "chemistry",
  "student_id": "4569",
  "values": "0.159,0.234,0.224"
}, {
  "subject": "physics",
  "student_id": "1478",
  "values": "0.16,0.235,0.225"
}]

const data = list.reduce((reduction, item) => {
  if (reduction[item.subject]) {
    reduction[item.subject][item.student_id] = item.values 
  } else {
    reduction[item.subject] = {
      [item.student_id]: item.values 
    }
  }
  return reduction
}, {})
console.log(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...