Lodash中的partialRight似乎什么也没做

Bel*_*ela 4 javascript lodash

(我找不到开放的Lodash Slack 频道,这就是我在这里发帖的原因。)

你能告诉我为什么这个小提琴partialRight中的似乎什么也没做吗?该函数正确地重命名了所提供的键,但该函数(应该执行完全相同的操作)却没有。correctRenameKeysobjectwrongRenameKeys

请在浏览器中打开 JavaScript 控制台以查看运行 fiddle 时的日志。我在 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);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

rye*_*lar 5

lodash 文档中有两个支持语句可以回答您的问题:

lodash#partialRight

此方法类似于 _.partial,只不过部分应用的参数附加到它接收的参数中。

lodash#map

通过 iteratee 运行集合中的每个元素来创建值数组。使用三个参数调用迭代器:(值、索引|键、集合)。

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

keyRenamer(value, index, collection, keyMappings);
Run Code Online (Sandbox Code Playgroud)

如果您确实想达到renameKeysOfOneObject部分应用函数第二个参数的效果,请使用lodash#partial。

const wrongRenameKeys = (objects, keyMappings) => {
    const keysRenamer = _.partial(renameKeysOfOneObject, _, keyMappings);
    return _.map(objects, keysRenamer);
};
Run Code Online (Sandbox Code Playgroud)

keyRenamer(value, index, collection, keyMappings);
Run Code Online (Sandbox Code Playgroud)
const wrongRenameKeys = (objects, keyMappings) => {
    const keysRenamer = _.partial(renameKeysOfOneObject, _, keyMappings);
    return _.map(objects, keysRenamer);
};
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)