我有这段代码:
var answers = _.clone($scope.question.answers)
var answers = {};
$scope.question.answers.forEach(function (element, index) {
answers[index].answerUid = element.answerUid;
answers[index].response = element.response;
});
有什么方法可以使用lodash简化这个吗?
答案 0 :(得分:13)
我不清楚你想要迭代的是什么,以及你期望在最后得到什么。例如,当前编写问题代码的方式,此行将导致错误:
answers[index].answerUid = element.answerUid;
因为它会从answers[index]
对象中读取answers
,所以获取undefined
并尝试访问answerUid
值的字段undefined
。
无论如何,我可以涵盖重大案件。如果您希望answers
成为一个数组,那么就可以这样做:
var answers = _.map($scope.question.answers,
_.partialRight(_.pick, "answerUid", "response"));
无论$scope.question.answers
是数组还是Object
,这都有效。 _.partialRight(_.pick, "answerUid", "response"))
来电相当于:
function (x) {
return _.pick(x, ["answerUid", "response"]);
}
_.pick
函数从对象中选择两个字段answerUid
和response
。
如果$scope.question.answers
是键/值映射,并且您希望answers
中有相应的映射,则可以执行此操作:
var answers = _.mapValues($scope.question.answers,
_.partialRight(_.pick, "answerUid", "response"));
这里的所有解决方案都经过测试,但我在转录中引入了错字并非不可能。
答案 1 :(得分:0)
不需要使用lodash,原生reduce也可以正常工作 - 假设答案是一个直线阵列(看起来你正在使用角度?)。
var answers = _.clone($scope.question.answers)
var filteredAnswers = answers.reduce(function(working, current, index ){
working.push({
answerUid: current.answerUid,
response: current.response
});
return working;
},[]);
如果这令人困惑,这是另一个使用reduce来对数字数组求和的例子:
[1,2,3].reduce(function(sum, current){return sum + current;},0); // 6
最后的零是传递给回调的初始值(如上所述),并且返回的值将传递给函数的下一次调用。继续返回,在你的功能体内过滤,然后离开你。 Reduce可以返回您喜欢的任何结构,而不仅仅是单个原始值。
编辑:看起来你在一个带有数值的对象上分配键 - 如果你需要一个对象而不是一个数组,那就有点不同了。
答案 2 :(得分:0)