Javascript 如何使用映射传递动态字段集的字段数组

Javascript 如何使用映射传递动态字段集的字段数组,javascript,arrays,Javascript,Arrays,下面的回答代码: 在互联网上,我看到了一些功能,这些功能可以帮助我找到我需要的东西。然而,我正在努力使它更有活力 原始阵列: [ { Id: 1, Field1: 'Value10', Field2: 'Value20', LastSaveDate: 'xxx', LastSaveUserId: 2, Field3: 'Value30' }, { Id: 2, Field1: 'Value11', Field2: 'Value21', LastSaveDate: 'xxx', LastS

下面的回答代码:

在互联网上,我看到了一些功能,这些功能可以帮助我找到我需要的东西。然而,我正在努力使它更有活力

原始阵列:

[
  { Id: 1, Field1: 'Value10', Field2: 'Value20', LastSaveDate: 'xxx', LastSaveUserId: 2, Field3: 'Value30' },
  { Id: 2, Field1: 'Value11', Field2: 'Value21', LastSaveDate: 'xxx', LastSaveUserId: 2, Field3: 'Value31' },
  { Id: 3, Field1: 'Value12', Field2: 'Value22', LastSaveDate: 'xxx', LastSaveUserId: 2, Field3: 'Value32' }
]
因此,下面的代码将获取一组常量字段,并将它们从输出数组中删除

const dataSet = items.map(({ Id, LastSaveDate, LastSaveUserId, ...item }) => item);
将返回:

[
  { Field1: 'Value10', Field2: 'Value20', Field3: 'Value30' },
  { Field1: 'Value11', Field2: 'Value21', Field3: 'Value31' },
  { Field1: 'Value12', Field2: 'Value22', Field3: 'Value32' }
]
这很好,但是,我希望将映射的
Id、LastSaveDate、LastSAveUserId
部分作为数组、对象或动态对象传递,这样我就可以从中生成一个更有用的函数,如下所示:

exportToCSV(items, fileName, discardedFields) {
  ...
  const dataSet = items.map(({ discardFields, ...item }) => ({ item }));
  ...
}
ExportToCSV(items, 'Sites', ['AnotherField', 'ThisField']);
回答

在下面@Felix Kling的基础上进行扩展,下面是我现在所拥有的有效工具。我还添加了一些字段,这些字段在许多(如果不是所有)可导出数据集中都是常量

removeFieldsFromObject(obj, fields) {
    const commonRemovals = ['Id', 'LastSaveDate', 'MapData','LastSaveUserId'];
    const removals = new Set([...fields, ...commonRemovals]);

    return Object.fromEntries(
        Object.entries(obj).filter(([field]) => !removals.has(field)),
    );
},

exportToCSV(items, fileName, discardFields) {
    ...
    dataSet.forEach((item, index) => {
        dataSet[index] = this.removeFieldsFromObject(item, discardFields);
    });
    ... // dataSet now has only the desired fields to export
},
调用此方法的过程如下所示:

exportToCSV(items, fileName, discardedFields) {
  ...
  const dataSet = items.map(({ discardFields, ...item }) => ({ item }));
  ...
}
ExportToCSV(items, 'Sites', ['AnotherField', 'ThisField']);

因此,最终的数组永远不会包含以下字段:
Id、LastSaveDate、MapData、LastSaveUserId、AnotherField、ThisField
创建另一个助手函数,通过简单地在数组上迭代并创建一个新对象来选择(或丢弃)字段:

function discard(obj, fields) {
  const result = {};
  fields = new Set(fields);
  for (const field of Object.keys(obj)) {
    if (!fields.has(field)) {
      result[field] = obj[field];
    }
  }
  return result;
}
或更“实用”:


我对它进行了一些扩展,但你让我明白了@Felix Kling