【问题标题】:forEach loop not updating array as desiredforEach 循环没有根据需要更新数组
【发布时间】:2021-05-19 15:59:59
【问题描述】:

我正在尝试遍历 consoleOuputParamsOBJ 并更新我的 taskparamscompiled 对象列表中的记录

期望的输出

    {
    "process00x00": {
        "-i": "D:\\Code\\UnitTest\\ConsoleApp\\1\\00x00.png",
        "-tr": 16,
        "-tc": 16,
        "-ofr": 16,
        "-ofc": 16,
        "-outfile": "\"D:\\Code\\UnitTest\\ConsoleApp\\Process\\1\""
    },
    "process00x01": {
        "-i": "D:\\Code\\UnitTest\\ConsoleApp\\1\\00x01.png",
        "-tr": 16,
        "-tc": 16,
        "-ofr": 16,
        "-ofc": 16,
        "-outfile": "\"D:\\Code\\UnitTest\\ConsoleApp\\Process\\1\""
    },
    "process00x02": {
        "-i": "D:\\Code\\UnitTest\\ConsoleApp\\1\\00x02.png",
        "-tr": 16,
        "-tc": 16,
        "-ofr": 16,
        "-ofc": 16,
        "-outfile": "\"D:\\Code\\UnitTest\\ConsoleApp\\Process\\1\""
    }

我目前正在做什么,进程名称似乎正在工作,因为它正在更新该值,但它用来更新它的数据只是 taskparamscompiled 数据集中的最后一条记录。

当前代码更新:

var consoleOutputParamsOBJ = [{
    name: '00x00',
    filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\00x00.png'
  },
  {
    name: '00x01',
    filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\00x01.png'
  },
  {
    name: '00x02',
    filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\00x02.png'
  },
  {
    name: '01x00',
    filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\01x00.png'
  },
  {
    name: '01x01',
    filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\01x01.png'
  },
  {
    name: '01x02',
    filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\01x02.png'
  }
]

var taskparamscompiled = {
  haralick_process00x00: {
    '-i': '',
    '-tr': 16,
    '-tc': 16,
    '-ofr': 16,
    '-ofc': 16,
    '-outfile': '"D:\\Code\\UnitTest\\ConsoleApp\\Process\\1"'
  },
  haralick_process00x01: {
    '-i': '',
    '-tr': 16,
    '-tc': 16,
    '-ofr': 16,
    '-ofc': 16,
    '-outfile': '"D:\\Code\\UnitTest\\ConsoleApp\\Process\\1"'
  },
  haralick_process00x02: {
    '-i': '',
    '-tr': 16,
    '-tc': 16,
    '-ofr': 16,
    '-ofc': 16,
    '-outfile': '"D:\\Code\\UnitTest\\ConsoleApp\\Process\\1"'
  },
  haralick_process01x00: {
    '-i': '',
    '-tr': 16,
    '-tc': 16,
    '-ofr': 16,
    '-ofc': 16,
    '-outfile': '"D:\\Code\\UnitTest\\ConsoleApp\\Process\\1"'
  },
  haralick_process01x01: {
    '-i': '',
    '-tr': 16,
    '-tc': 16,
    '-ofr': 16,
    '-ofc': 16,
    '-outfile': '"D:\\Code\\UnitTest\\ConsoleApp\\Process\\1"'
  },
  haralick_process01x02: {
    '-i': '',
    '-tr': 16,
    '-tc': 16,
    '-ofr': 16,
    '-ofc': 16,
    '-outfile': '"D:\\Code\\UnitTest\\ConsoleApp\\Process\\1"'
  }
}
var dynamicTaskParamsBaseOBJ = {
  '-i': '',
  '-tr': 16,
  '-tc': 16,
  '-ofr': 16,
  '-ofc': 16,
  '-outfile': '"D:\\Code\\UnitTest\\ConsoleApp\\HaralickProcess\\1"'
}
var dynamicTaskNameBaseOBJ = 'haralick_process'

var taskparamscompiled = consoleOutputParamsOBJ.reduce(
  (accumulator, elem) => {
    const taskname = dynamicTaskNameBaseOBJ + elem.name;
    return {
      ...accumulator,
      [taskname]: dynamicTaskParamsBaseOBJ,
    };
  }, {}
);


consoleOutputParamsOBJ.forEach((obj) => {
  var processname = dynamicTaskNameBaseOBJ + obj.name;
  filepath = obj.filepath;
  taskparamscompiled[processname]['-i'] = filepath;
});

console.log('consoleOutputParamsOBJ::', consoleOutputParamsOBJ, '  \n taskparamscompiled::', taskparamscompiled);

【问题讨论】:

    标签: javascript node.js arrays foreach


    【解决方案1】:

    这是问题中提供的代码的最小版本。它按预期工作。

    const outputParams = [
      {
        name: '00x00',
        filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\00x00.png',
      },
      {
        name: '00x01',
        filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\00x01.png',
      },
      {
        name: '00x02',
        filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\00x02.png',
      },
    ];
    
    const taskparamscompiled = {
      process00x00: {},
      process00x01: {},
      process00x02: {}
    };
    
    const dynamicTaskNameBaseOBJ = 'process';
    
    outputParams.forEach((obj) => {
      var processname = dynamicTaskNameBaseOBJ + obj.name;
      filepath = obj.filepath;
      taskparamscompiled[processname]['-i'] = filepath;
    });
    
    console.log('taskparamscompiled:', taskparamscompiled);

    注意filepath 没有被声明,它是多余的。但这不会导致报告的问题:

    它正在用记录的最后一个实例更新所有记录

    由于提供的代码可以正常工作,问题一定出在一些没有提供的代码上。

    【讨论】:

    • 所以只是为了确认一下,这应该采用适当的文件路径并更新 -i 值 taskpramscompiled?
    • @JustinMiller 是的,这就是我从您在问题中发布的内容推断出来的。运行代码 sn -p 查看输出。
    • 我更新了我目前拥有的内容。我包含了更多我的代码。谢谢你让我进一步回顾我的代码。
    【解决方案2】:

    出现您的问题是因为您正在使用此行将同一对象的副本分配给 taskparamscompiled 中的每个键:

    [taskname]: dynamicTaskParamsBaseOBJ
    

    您需要复制对象,您可以使用Object.assign 来完成。您可以在构建 taskparamscompiled 对象的同时使用它来更新输入文件名(-i 属性):

    const consoleOutputParamsOBJ = [{
        name: '00x00',
        filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\00x00.png'
      },
      {
        name: '00x01',
        filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\00x01.png'
      },
      {
        name: '00x02',
        filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\00x02.png'
      },
      {
        name: '01x00',
        filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\01x00.png'
      },
      {
        name: '01x01',
        filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\01x01.png'
      },
      {
        name: '01x02',
        filepath: 'D:\\Code\\UnitTest\\ConsoleApp\\1\\01x02.png'
      }
    ]
    
    const dynamicTaskParamsBaseOBJ = {
      '-i': '',
      '-tr': 16,
      '-tc': 16,
      '-ofr': 16,
      '-ofc': 16,
      '-outfile': '"D:\\Code\\UnitTest\\ConsoleApp\\HaralickProcess\\1"'
    }
    const dynamicTaskNameBaseOBJ = 'haralick_process'
    
    const taskparamscompiled = consoleOutputParamsOBJ.reduce(
      (accumulator, elem) => {
        const taskname = dynamicTaskNameBaseOBJ + elem.name;
        return {
          ...accumulator,
          [taskname]: Object.assign({}, dynamicTaskParamsBaseOBJ, { '-i' : elem.filepath })
        };
      }, {}
    );
    
    
    console.log(taskparamscompiled);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-10
      • 2018-11-10
      • 1970-01-01
      • 2016-03-11
      • 2016-02-26
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      相关资源
      最近更新 更多