Ramda JS:如何执行一个地图,我在每个对象上为R.replace调用给定属性?

时间:2016-05-22 19:46:42

标签: javascript functional-programming ramda.js

鉴于以下数据:

const my_data = [
  {
    name: "John",
    age: 22
  },
  {
    name: "Johnny",
    age: 15
  },
  {
    name: "Dave",
    age: 27
  }
]

我想转换数据,使子串" John"取而代之的是" Ben"在每个名称属性中,所以它看起来像这样:

[
  {
    name: "Ben",
    age: 22
  },
  {
    name: "Benny",
    age: 15
  },
  {
    name: "Dave",
    age: 27
  }
]

我想以正确的功能方式这样做(我认为没有点,但我还在学习),所以我可以在管道中重复使用它,比如首先按年龄减少然后进行替换,或者执行首先替换然后进行排序。我如何使用Ramda函数执行此操作?

var fix_names = ???
var fixed_data = R.map( fix_names, my_data );

2 个答案:

答案 0 :(得分:5)

R.map(R.over(R.lensProp('name'), R.replace('John', 'Ben')))(my_data)

请参阅R.overR.lensProp

答案 1 :(得分:1)

没有理由更喜欢无点功能。可读性才是真正重要的:

var myData = [ new Person("John",   22)
             , new Person("Johnny", 15)
             , new Person("Dave",   27)
             ];

var fixedData = myData.map(fixName);

alert(JSON.stringify(fixedData, null, 4));

function fixName(person) {
    return Object.assign(new Person, person, {
        name: person.name.replace(/John/g, "Ben")
    });
}

function Person(name, age) {
    this.name = name;
    this.age  = age;
}

eta conversionfunction composition等非常有限的情况下,无点函数非常有用。无点函数不应被视为函数式编程的基石。