Манипулирование JSON с помощью Lodash

1

используя этот код let result = _.groupBy(obj, 'type'); У меня есть это возвращение:

{
    "success": [{
        "type": "success",
        "messages": "Assignment saved."
    }, {
        "type": "success",
        "messages": "Assignment saved."
    }, {
        "type": "success",
        "messages": "Assignment saved."
    }]
}

Но мне нужно обратиться к этому:

{
    "error": ["Error msg", "Error 2 msg", "Error 3 msg"],
    "notice": ["Notice 1 msg", "Notice 2 msg"],
    "success": ["Success 1 msg", "Success 2 msg", "Success 3 msg"]
}

Что мне делать по-другому в моем коде?

Некоторая конфигурация на Lodash, которую я пропускаю?

  • 0
    ну, они сгруппированы по типу, это не предназначено для изменения объектов
  • 0
    lodash.com/docs/4.17.10#groupBy
Показать ещё 3 комментария
Теги:
lodash

3 ответа

1
Лучший ответ

Взгляните на эту скрипку для рабочего решения. С помощью этого решения вы не блокируете одно и то же сообщение.

Ive использовал _.groupBy

let list = [{type: "success", message: "msg1"},{type: "success", message: "msg2"},{type: "success", message: "msg3"},{type: "notice", message: "msg1"}, {type: "notice", message: "msg2"}, {type: "error", message: "msg1"}]

console.log("\n\n---------Full initial list of events");
console.log(list);

console.log("\n\n---------Events grouped by type");
console.log(_.groupBy(list, 'type'));

console.log("\n\n---------Your format");
let groups = _.groupBy(list, 'type')
let keys = Object.keys(groups);
for (let key of keys) {
    groups[key] = groups[key].map(elem => elem.message)
}
console.log(groups);
  • 1
    Вы также делаете _.forOwn(groups, v => v.map((v2,i,a) => a[i] = v2.message))
1

Код, включенный в вопрос, запутан. Что-то вроде этого?

const result = _(obj)
  .groupBy("type")
  .mapValues(objs => objs.map(o => o.messages))
  .value()
  • 0
    Не работает как этот jsfiddle.net/2pwznacr
  • 0
    @CoderPi: 1) Загружен ли lodash в эту скрипку? 2) OP имеет messages качестве ключа, а не message .
0

Библиотеки - это не всегда путь:

function groupMessagesByType(dataIn) {
  let dataOut = {}
  
  for(var i = 0; i < dataIn.length; ++i) {
    var type = dataIn[i].type
    if(typeof dataOut[type] == "undefined") {
      dataOut[type] = []
    }
    dataOut[type].push(dataIn[i].messages)
  }

  return dataOut
}

// Example:
var data = [{
        "type": "success",
        "messages": "Assignment saved."
    }, {
        "type": "success",
        "messages": "Assignment saved."
    }, {
        "type": "error",
        "messages": "Error msg."
    }]
console.log(groupMessagesByType(data))
  • 0
    Спасибо, это решение работает. Я также сделал что-то подобное, но я пытался использовать LoDash в этом случае, но это невозможно, или я пропускаю некоторую информацию. Еще раз спасибо, чувак.
  • 0
    Вы можете делать что угодно без библиотек, но если их использование делает код более декларативным (и, возможно, более коротким), используя хорошо известные функциональные абстракции (map, filter, sortBy и т. Д.), Почему бы и нет?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню