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 循环没有根据需要更新数组的主要内容,如果未能解决你的问题,请参考以下文章