ES6的下划线方法

时间:2016-08-05 13:28:43

标签: javascript ecmascript-6 underscore.js

有人可以看看这个并理解如何将其变成原生JS。

_.chain(polls).deepClone().indexBy("id").value()

我试图查找deepClone,但无法找到它的来源。这是我接手的代码,对它并不熟悉。谢谢你的帮助。

以下是我的一个工作示例:

function loadPolls () {
    return ScheduledEventService.getPolls($scope.webcastId)
        .then(function(polls){
            $scope.originalPolls = _.chain(polls).deepClone().indexBy("id").value();
            $scope.webcast.polls = polls;

            _.each(polls, function(poll){
                poll.answers = _.map(_.range(Polls.MaxAnswers), function(i){
                    return (poll.answers && poll.answers[i]) || {};
                });

                poll.readOnly = poll.status !== "Closed" || poll.totalResponses > 0;
            });
        });
}

1 个答案:

答案 0 :(得分:1)

deepCloneindexBy(来自Underscore)都没有直接的原生等价物。

indexBy很容易:

function indexBy(object, key) {
  return Object.keys(object).reduce(result, k) {
    const value = object[k];
    result[value[key]] = value;
    return result;
  });
}

这使用reduce遍历输入对象(实际上,遍历其键),并构建一个result对象,其键是每个id属性的值子对象,其值是子对象本身,就像_.indexBy那样。

deepClone你必须找到一些版本的。 SO上有很多。

有了这些,你的逻辑就是

indexBy(deepClone(polls), 'id')

如果只需要一个级别的深度克隆,您可以将上面的行更改为

result[value[key]] = Object.assign({}, value);

然后再做

indexBy(polls, 'id')