Как преобразовать строку в пользовательский объект, используя несколько разделителей, Uncaught (в обещании): TypeError: Невозможно прочитать свойство undefined

db.users.remove({'_id':{'$in':inactive_users}})
0
задан Nelson King 19 January 2019 в 06:39
поделиться

2 ответа

Это поможет, используя только встроенный JavaScript, который должен работать в любой последней версии Node.JS:

const str = "6:00AM - Get up, Make the bed, Brush my teeth. 6:45AM - Take a shower. 7:15AM - Have breakfast, Leave for school."

sentences = {};
// split the string on periods, and trim each sentence
for (sentence of str.split('.').map(x => x.trim())) {
    // you end up with a completely empty sentence when the last
    // sentence ends in a period, which is uninteresting
    if (sentence) {
        // split each sentence on a hyphen, and assume the first
        // element is time and the second is actions
        let [time, actions] = sentence.split(' - ');

        // split the actions string on commas and trim whitespace;
        // store that in our sentences object
        sentences[time] = actions.split(',').map(x => x.trim());
    }
}

Тогда console.log(sentences) в конце даст вам:

[ 111]
0
ответ дан dtanabe 19 January 2019 в 06:39
поделиться

Может быть, это довольно наивное решение, но вы можете решить что-то подобное с помощью комбинации split и map.

Допустим, у вас есть строка. Вы можете начать разбивать его по первому наибольшему разделителю (точка в этом примере).

const string = "6:00AM - Get up, Make the bed, Brush my teeth. 6:45AM - Take a shower. 7:15AM - Have breakfast, Leave for school."
const firstSplit = string.split(".");

То, что у вас сейчас есть в firstSplit, будет что-то вроде ["6:00AM - Get up, Make the bed, Brush my teeth", "6:45AM - Take a shower", "7:15AM - Have breakfast, Leave for school"]. Теперь вы можете разделить каждое из значений в этом массиве на час и активности.

Так как я хочу разделить каждый элемент в массиве (получив новый массив с результатами), я буду использовать map

const secondSplit = firstSplit.map(each => each.split(" - "))

Теперь secondSplit будет выглядеть примерно как [["6:00AM", "Get up, Make the bed, Brush my teeth"], ["6:45AM", "Take a shower"], ["7:15AM", "Have breakfast, Leave for school"]] [ 1119]

Теперь давайте преобразуем этот странный массив массивов в объект, в котором первая позиция каждого небольшого массива является ключом, а вторая - значением. Я буду использовать vainilla javascript, но, конечно, это будет проще с любой библиотекой js (например, lodash или ramda)

const almostThere = secondSplit.reduce((object, subarray) => {
  object[subarray[0]] = subarray[1]
  return object
}, {})

Это невероятно близко к тому, что вы на самом деле хотите. Объект выглядит примерно так:

{
  6:00AM: "Get up, Make the bed, Brush my teeth",
  6:45AM: "Take a shower",
  7:15AM: "Have breakfast, Leave for school"
}

Обратите внимание, что нам не хватает еще одного разбиения на каждое из значений объекта. Мы можем справиться с этим, изменив reduce, сделанное ранее

const yeay = secondSplit.reduce((object, subarray) => {
  object[subarray[0]] = subarray[1].split(", ")
}, {})

И все!

В целом это может выглядеть примерно так:

const firstSplit = string.split(".")
 .map(each => each.split(" - "))
 .reduce((object, subarray) => {
  object[subarray[0]] = subarray[1].split(", ")
  return object
}, {})

может быть оптимизирован примерно так:

const yeay = string.split(".")
 .reduce((object, hourAndChores) => {
    const splittedHourAndChores = hourAndChores.split(" - ");
    object[splittedHourAndChores[0]] = splittedHourAndChores[1].split(", ")
    return object
}, {})
0
ответ дан Claudio 19 January 2019 в 06:39
поделиться
Другие вопросы по тегам:

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