如何将每个对象添加一个键的_.each函数转换为Ramda?

时间:2016-10-26 18:59:52

标签: javascript functional-programming lodash ramda.js

http://jsfiddle.net/leongaban/4xfc4g3c/1/

Lodash

const spamData = [true, true, false];
const tweets   = [{ tweet: "Hello" }, { tweet: "World" }, { tweet: "Pork"}];

_.each(spamData, (value, i) => {
  tweets[i]['spam'] = value;
});

log(tweets);

坚持这一点:

Ramda

const setSpamValues = (spamValue) => {
    return spamValue;
};

R.forEach(setSpamValues, spamData);

不确定现在将返回的spamValue发送到每个推文的名为spam的新密钥的最佳方法是什么。

2 个答案:

答案 0 :(得分:4)

您还可以使用R.zipWithR.assoc来实现此目标。

const updatedTweets = R.zipWith(R.assoc('spam'), spamData, tweets);

答案 1 :(得分:3)

在利用库为你做这件事之前,你应该养成如何自己解决这些问题的习惯。如果你正在努力解决这个基本问题,你可能想要重新考虑你对Ramda的使用。一旦你理解了Ramda提供的实用程序,那么使用它可能是有意义的。

除了普通的JavaScript之外,您正在寻找的结果。

const spamData = [true, true, false];
const tweets   = [{ tweet: "Hello" }, { tweet: "World" }, { tweet: "Pork"}];

let result = tweets.map((t,i) =>
  Object.assign({}, t, {spam: spamData[i]})
);

console.log(result);
// [
//   {"spam": true, "tweet": "Hello"},
//   {"spam": true, "tweet": "World"},
//   {"spam": false, "tweet": "Pork"}
// ]

如果你坚持使用Ramda,你可能正在寻找R.zip

const spamData = [true, true, false];
const tweets   = [{ tweet: "Hello" }, { tweet: "World" }, { tweet: "Pork"}];

let result = R.zip(spamData, tweets).map(([spam, tweet]) =>
  Object.assign({}, tweet, {spam})
);

console.log(result);
// [
//   {"spam": true, "tweet": "Hello"},
//   {"spam": true, "tweet": "World"},
//   {"spam": false, "tweet": "Pork"}
// ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.22.1/ramda.js"></script>

ps,下次你问一个问题时,你应该包括预期的输出。