【问题标题】:How to chain this reduce and map function如何链接这个reduce和map函数
【发布时间】:2017-10-14 23:07:10
【问题描述】:

这两个参数都是对象列表。它们都包含属性名称。我想在属性名称相等的情况下投影他们的一些属性。下面给出正确的结果。但是,有人可以帮我将其重构为一次遍历吗?

 export function fieldProjections(docTypeFields, recordFields) {
    const recordsByName = recordFields.reduce(function (rec, field) {
        rec[field.Name] = field;
        return rec;
    }, {});
    const fields = docTypeFields.map(dt => {
        return {
            'Name': dt.Name,
            'RawValue': recordsByName[dt.Name].RawValue,
            'Type': dt.DataType,
            'Value': recordsByName[dt.Name].Value,
            'Id': dt.DocumentTypeFieldID
        };
    });
    return fields;
}

【问题讨论】:

  • “将其重构为一次遍历?” - 为什么?当前代码每个输入数组只遍历一次,所以我看不出你怎么能遍历得更少。顺便说一句,如果您使用单个对象文字一次创建所有属性,则可以整理 .map() 回调。
  • 它不会比你已经拥有的更好。但是您可以使用 Map 而不是散列/“关联数组”。
  • 我认为单次遍历是用词不当。我想在一个表达式中执行上述操作。

标签: javascript dictionary reduce


【解决方案1】:

let docTypeFields = [{Name: 'doc1', RawValue: '8', Type: 'large', Value: '3.50', Id: '1'},{Name: 'doc2', RawValue: '11', Type: 'medium', Value: '4.50', Id: '2'},{Name: 'doc3', RawValue: '81', Type: 'largish', Value: '3.60', Id: '3'},{Name: 'doc4', RawValue: '22', Type: 'small', Value: '2.50', Id: '4'}],
  recordFields = [{Name: 'doc1', Field: 'field1'},{Name: 'doc2', Field: 'field2'},{Name: 'doc3', Field: 'field3'},{Name: 'doc4', Field: 'field4'}];

docTypeFields.forEach(doc => {
    let siblingRecord = recordFields.find(record => record.Name === doc.Name);
    if (siblingRecord) doc.Field = siblingRecord.Field;
});

console.log(docTypeFields);

【讨论】:

  • 这会导致 更多 次迭代而不是 OP 的代码。 (它会改变输入数据。)
  • 这很公平。我没有注意到他想要一次遍历,只是试图简化代码。至于对象突变,复制每个文档并将其存储在一个新数组中是微不足道的(尽管我应该强调我正在修改 docTypeFields)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多