javascript – Lodash中的partialRight似乎什么都不做

(我找不到一个open Lodash Slack频道,这就是我在这里发帖的原因.)

你能否告诉我为什么这个fiddle中的partialRight似乎无能为力? correctRenameKeys函数正确地重命名提供的对象中的键,但wrongRenameKeys函数 – 应该完全相同 – 不会.

请在浏览器中打开JavaScript控制台,以便在运行小提琴时查看日志.我在Chrome中测试了它.

    const renameKeysOfOneObject = (object, keyMappings) => {
      return _.reduce(object, function(result, value, key) {
        key = keyMappings[key] || key;
        result[key] = value;
        return result;
      }, {});
    };

    const correctRenameKeys = (objects, keyMappings) => {
        const keysRenamer = object => renameKeysOfOneObject(object, keyMappings);
        return _.map(objects, keysRenamer);
    };

    const wrongRenameKeys = (objects, keyMappings) => {
        const keysRenamer = _.partialRight(renameKeysOfOneObject, keyMappings);
        return _.map(objects, keysRenamer);
    };

    const object = {keyToBeRenamed: 'someValue'};
    const objects = [object];
    const keyMapping = {keyToBeRenamed: 'newKeyName'};

    const correctlyRenamed = correctRenameKeys(objects, keyMapping);
    const wronglyRenamed = wrongRenameKeys(objects, keyMapping);

    console.assert(_.isEqual(correctlyRenamed, wronglyRenamed), 
                   "The two objects should be equal. " + 
                   "The 'keyToBeRenamed' key should have been renamed to 'newKeyName'.");
    console.log(correctlyRenamed);
    console.log(wronglyRenamed);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

解决方法:

来自lodash文档的两个支持声明可以回答您的问题:

lodash#partialRight

This method is like _.partial except that partially applied arguments
are appended to the arguments it receives.

lodash#map

Creates an array of values by running each element in collection thru
iteratee. The iteratee is invoked with three arguments: (value,
index|key, collection).

请注意,在lodash #map iteratee中传递了三个参数,并且由于keyRenamer是作为iteratee传递的,因此我们可以得出结论,调用签名将如下所示:

keyRenamer(value, index, collection, keyMappings);

如果你真的想要实现部分应用函数renameKeysOfOneObject的第二个参数的效果,那么使用lodash#partial.

const wrongRenameKeys = (objects, keyMappings) => {
    const keysRenamer = _.partial(renameKeysOfOneObject, _, keyMappings);
    return _.map(objects, keysRenamer);
};
const renameKeysOfOneObject = (object, keyMappings) => {
      return _.reduce(object, function(result, value, key) {
        key = keyMappings[key] || key;
        result[key] = value;
        return result;
      }, {});
    };

    const correctRenameKeys = (objects, keyMappings) => {
        const keysRenamer = object => renameKeysOfOneObject(object, keyMappings);
        return _.map(objects, keysRenamer);
    };

    const wrongRenameKeys = (objects, keyMappings) => {
        const keysRenamer = _.partial(renameKeysOfOneObject, _, keyMappings);
        return _.map(objects, keysRenamer);
    };

    const object = {keyToBeRenamed: 'someValue'};
    const objects = [object];
    const keyMapping = {keyToBeRenamed: 'newKeyName'};

    const correctlyRenamed = correctRenameKeys(objects, keyMapping);
    const wronglyRenamed = wrongRenameKeys(objects, keyMapping);

    console.assert(_.isEqual(correctlyRenamed, wronglyRenamed), 
                   "The two objects should be equal. " + 
                   "The 'keyToBeRenamed' key should have been renamed to 'newKeyName'.");
    console.log(correctlyRenamed);
    console.log(wronglyRenamed);
.as-console-wrapper{min-height:100%;top:0}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
上一篇:javascript – 使用两个不同的数组创建一个分组数组


下一篇:javascript – 如何唯一地合并两个对象数组?