forEach 循环没有根据需要更新数组

Posted

技术标签:

【中文标题】forEach 循环没有根据需要更新数组【英文标题】:forEach loop not updating array as desired 【发布时间】: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);

【问题讨论】:

【参考方案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);

【讨论】:

以上是关于forEach 循环没有根据需要更新数组的主要内容,如果未能解决你的问题,请参考以下文章

详细讲解foreach循环的用法

php foreach循环中的变量

foreach使用方法

for循环 switch foreach用法合区别

C#中foreach语句的作用?

foreach循环的跳出