Dynami c Создание имени переменной в JS с использованием Loda sh или ES6 - PullRequest
0 голосов
/ 27 февраля 2020

Вместо ссылки fields[0] fields[1], Кто-то помогает мне строить динамически.

//fields =['string1','string2']  

createNestedSubDoc(id, body, fields) {
    return this.model.findById(id).then(doc => {
        doc[fields[0]][fields[1]].push(body)
        return doc.save()
    })
}

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Это не элегантно, но я уверен, что это то, что вы хотите сделать.

// Your current code:
//fields =['string1','string2']  

//createNestedSubDoc(id, body, fields) {
//    return this.model.findById(id).then(doc => {
//        doc[fields[0]][fields[1]].push(body)
//        return doc.save()
//    })
//}

// Lodash solution.
const fields = ['string1', 'string2'];

function createNestedSubDoc(id, body, fields) {
  return this.model.findById(id)
    .then((doc) => {
      const path = _.join(fields, '.');
      const currentPathArray = _.get(doc, path, []);
    
      _.set(doc, path, _.concat(currentPathArray, [body]);
      
      return doc.save();
    });
}
0 голосов
/ 27 февраля 2020

Вот что вы делаете прямо сейчас:

// Your code pushes body to the array doc.key1.key2
// Is that the behaviour you want?
const doc = {
   key1: {
      key2: []
   }
}

const fields = ['key1', 'key2']

createNestedSubDoc(id, body, fields) {
    return this.model.findById(id).then(doc => {
        doc[fields[0]][fields[1]].push(body)
        return doc.save()
    })
}

Если число полей неизвестно, вы можете использовать lodash.pick:

const _ = require('lodash')

createNestedSubDoc(id, body, fields) {
  return this.model.findById(id).then(doc => {
    const arrayPropertyInDoc = _.pick(doc, fields)
      arrayPropertyInDoc.push(body)
      return doc.save()
  })
}

Если вы являетесь на самом деле попытайтесь сделать, это объединить фрагмент документа, содержащийся в body, с определенной точкой в ​​doc, тогда pu sh не правильный метод.

...