2017-01-03 6 views
0

Функциональное программирование новичков здесь. У меня есть этот объект:Функциональное программирование/Ramda: создание нового объекта путем выбора вложенных свойств

{ 
    _id: '2014d5db-55dc-4078-ae87-382c226d0785', 
    _source: { 
    phone: '00447827434313', 
    ... 
    } 
} 

В конце концов, я хочу, чтобы он в этом формате:

{ 
    id: '2014d5db-55dc-4078-ae87-382c226d0785', 
    phone: '00447827434313', 
    ... 
} 

В основном извлекая _source и переименовании _id в id.

Я создал эту функцию, ниже которой работает, но я пытаюсь использовать только функции Рамды вместо создания новых объектов вручную. Я предполагаю, что это более «функциональный» способ, дайте мне знать, если это не имеет большого значения.

const test = o => merge(o._source, { id: o._id }) 

Большое спасибо

+0

Будет ли ваш выход всегда плоским? (I.e. нет вложенных свойств?) –

+0

@ScottSauyet Идеально да. Я просто хочу иметь что-то внутри '_source' и добавлять' _id' сверху, переименован как 'id'. –

ответ

1

Я не думаю, что есть конкретный встроенный Ramda функция для этого. Но это не так трудно написать один поверх lensPath, view и map:

const remap = R.curry((desc, obj) => R.map(path => R.view(R.lensPath(path), obj), desc)); 

const myExtract = remap({ 
    id: ['_id'], 
    phone: ['_source', 'phone'] 
}); 

myExtract(input); 
//=> {"id": "2014d5db-55dc-4078-ae87-382c226d0785", "phone": "00447827434313"} 

Он работает только это просто, если ваш выход описывается в виде плоского списка полей (конечно, их свойства могут быть сами объекты.) Но тот, где вы вытащили из вложенных путей и нажали на вложенные пути, не было бы слишком сложнее писать. По-моему, пользовательский API будет более уродливым.

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

Вы можете увидеть это в действии на Ramda REPL.

+0

Большое спасибо @ScottSauyet, это очень полезно. Согласны ли вы с тем, что функция 'test()' не является функциональным способом ее выполнения? Я просто хочу убедиться, что это справедливо для меня, чтобы искать что-то еще. –

+2

Я не думаю, что на этот вопрос есть один ответ. Ваш самый простой способ, и если вам не нужно что-то более многоразовое, почему бы просто не продолжить его? Если вы планируете повторно использовать его при сопоставлении разных полей, мое предложение может быть улучшением. И если вы хотите отобразить в более сложные структуры, вам нужно что-то еще более сложное. Единственным недостатком вашего оригинала является то, что он может включать поля, которые вы * не * хотите включить из 'source'. Если это не проблема, это совершенно правильное решение. –

Смежные вопросы