如何用lodash挑选数组的元素?

时间:2014-02-07 19:36:47

标签: javascript lodash

我有这段代码:

        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简化这个吗?

3 个答案:

答案 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函数从对象中选择两个字段answerUidresponse

如果$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)

您还需要将函数包装在unarydocs)中。否则,您将密钥和集合从iteratee传递到pick函数(docs),它可以(不得)导致意外结果。

var answers = _.mapValues($scope.question.answers, _.unary(_.partialRight(_.pick, 'answerUid', 'response')));