javascript - 管道、具有动态参数的 ramda

标签 javascript ramda.js

cons columnDefs = [
   {
     label: 'The_First_Name',
     value: getProp,
     args: ['firstName'] // different number of arguments depending on function
   },
   {
     label: 'City',
     value: getNestedProperty,
     args: ['location', 'city'] 
   }
]

const data = [
  {
     firstName: 'Joe',
     lastName: 'Smith',
     location: {
       city: 'London'
     }
  },
   {
     firstName: 'Anna',
     lastName: 'Andersson',
     location: {
       city: 'Stockholm'
     }
  }
]

const getProp = (object, key) => R.prop(key, object);

const getNestedProperty = (obj, args) => R.path(..args, obj);

用于映射数据的 Ramda 管道:

const tableBuilder = R.pipe(R.map); // some ramda functions in here

const rows = tableBuilder(data, columnDefs);

想要的输出:

rows output:

[
   {
      The_First_Name: 'Joe',
      city: 'London'
   },
   {
      The_First_Name: 'Anna',
      city: 'Stockholm'
   }
]

每行的关键是columnDefs 中的label 属性。该值是从 value 属性中的 Ramda 函数以及 args 属性中定义的参数获取的。

https://plnkr.co/edit/rOGh4zkyOEF24TLaCZ4e?p=preview

完全卡住了。这甚至可能与 Ramda 有关吗?或者用纯 JavaScript 来完成更好?

最佳答案

您可以使用 applySpec 从另一个对象创建一个对象:

const obj = applySpec({
  The_First_Name: prop('firstName'),
  city: path(['location', 'city'])
})

obj({
  firstName: 'Joe',
  lastName: 'Smith',
  location: {
     city: 'London'
   }
});
//=> {"The_First_Name": "Joe", "city": "London"}

然后您可以使用该函数来映射您的数组:

const data = [
  {
     firstName: 'Joe',
     lastName: 'Smith',
     location: {
       city: 'London'
     }
  },
   {
     firstName: 'Anna',
     lastName: 'Andersson',
     location: {
       city: 'Stockholm'
     }
  }
];

const obj = applySpec({
  The_First_Name: prop('firstName'),
  city: path(['location', 'city'])
})

console.log(

  map(obj, data)

);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {applySpec, prop, path, map} = R;</script>

<小时/>

这是将 columnDefs 转换为可与 applySpec 一起使用的对象的方法:

const spec = def => ({[def.label]: apply(def.value, def.args)});
const specs = compose(mergeAll, map(spec));

const columnDefs = [
   {
     label: 'The_First_Name',
     value: prop,
     args: ['firstName'] // different number of arguments depending on function
   },
   {
     label: 'City',
     value: path,
     args: [['location', 'city']]
   }
]

const data = [
  {
     firstName: 'Joe',
     lastName: 'Smith',
     location: {
       city: 'London'
     }
  },
   {
     firstName: 'Anna',
     lastName: 'Andersson',
     location: {
       city: 'Stockholm'
     }
  }
]

const spec = def => ({[def.label]: apply(def.value, def.args)});
const specs = compose(mergeAll, map(spec));

console.log(

  map(applySpec(specs(columnDefs)), data)

);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {apply, compose, mergeAll, map, prop, path, applySpec} = R;</script>

关于javascript - 管道、具有动态参数的 ramda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56186381/

相关文章:

javascript - 使用 MomentJS 提取日期后缀使其成为上标

javascript - Angular Material datepicker 手动打开

javascript - 基于对象中某些值的 Ramda 镜头

javascript - 使用 Ramda 对键和值对应用不同的函数

javascript - "fs.writefile"函数中的自定义文件名

javascript - 将 Canvas base64 图像上传到 parse.com 时图像链接损坏

javascript - Ramda.js 中的分组和求和

javascript - 使用 Ramda 处理 Promise 和 Wait

javascript - 从事件处理程序返回值到javascript的父函数

javascript - Ramda : access input object's properties inside R. ifElse() 函数调用