首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >接口的Node.js数组未正确填充

接口的Node.js数组未正确填充
EN

Stack Overflow用户
提问于 2019-04-27 01:26:07
回答 3查看 99关注 0票数 0

我正在尝试将4个文件读入一个对象数组中。但是,数组中的对象值都是最后一个对象。我想知道我为这种行为做了什么错事。

代码(代码已经简化,因此可能没有什么意义):

代码语言:javascript
运行
复制
import * as fs from "fs";

interface axObj {
    id: String;
    name: String;
    body: String;   
};
const logger = console;
const mypath = "/Users/autorun/Documents/Projects/Axway/Projects/axDeploy/data/rtczip/PD_only/";
const files:String[] = [
    "PD.DEVOPS.TEST.1.FS.json",
    "PD.DEVOPS.TEST.1.SFTP.json",
    "PD.DEVOPS.TEST.1.json",
    "PD.DEVOPS.TEST.1_AS2.json"
];

function doJobsSeqCall() {

    var pdObj: axObj = {
        id: "",
        name: "PD.Object",
        body: ""
    };
    var pdObjArray: axObj[] = [];

    var i = 0;
    var data: string = "";
    for (var file of files) {
        logger.debug("\nReading file: " + mypath + file);
        const data = fs.readFileSync(mypath + file, "utf8");
        if (!data) {
            throw "No data to post";
        }
        pdObj.id = String(i + 1);
        pdObj.body = data;
        pdObj.name = file;
        pdObjArray.push(pdObj);

        //Everything is correctly set here.
        logger.debug("Setting up axObj [" + pdObjArray[i].id + "]");
        logger.debug("Data file is valid with size: [" + pdObjArray[i].body.length + "]  file: [" + pdObjArray[i].name + "]");

        i++;
    }

    //Right after the for loop. This checking showed the last item was populated to all other array items which I don't understand at all.
    logger.debug("\n\nChecking pdObjArray Content");
    i = 1;
    for (let iAxObj of pdObjArray) {
        console.log("axSeqCall index: [" + i++ + "] name: [" + iAxObj.name + "]");
    }
};

try {
    doJobsSeqCall();
} catch (err) {
    logger.error(`Error: ${err}`);
    process.exit(-1);
};

结果在日志中:

代码语言:javascript
运行
复制
Reading file: /Users/autorun/Documents/Projects/Axway/Projects/axDeploy/data/rtczip/PD_only/PD.DEVOPS.TEST.1.FS.json
Setting up axObj [1]
Data file is valid with size: [754]  file: [PD.DEVOPS.TEST.1.FS.json]

Reading file: /Users/autorun/Documents/Projects/Axway/Projects/axDeploy/data/rtczip/PD_only/PD.DEVOPS.TEST.1.SFTP.json
Setting up axObj [2]
Data file is valid with size: [1625]  file: [PD.DEVOPS.TEST.1.SFTP.json]

Reading file: /Users/autorun/Documents/Projects/Axway/Projects/axDeploy/data/rtczip/PD_only/PD.DEVOPS.TEST.1.json
Setting up axObj [3]
Data file is valid with size: [1507]  file: [PD.DEVOPS.TEST.1.json]

Reading file: /Users/autorun/Documents/Projects/Axway/Projects/axDeploy/data/rtczip/PD_only/PD.DEVOPS.TEST.1_AS2.json
Setting up axObj [4]
Data file is valid with size: [874]  file: [PD.DEVOPS.TEST.1_AS2.json]


Checking pdObjArray Content
axSeqCall index: [1] name: [PD.DEVOPS.TEST.1_AS2.json]
axSeqCall index: [2] name: [PD.DEVOPS.TEST.1_AS2.json]
axSeqCall index: [3] name: [PD.DEVOPS.TEST.1_AS2.json]
axSeqCall index: [4] name: [PD.DEVOPS.TEST.1_AS2.json]

问题:

我不认为所有的名字都是PD.DEVOPS.TEST.1.AS2.json,在“检查pdObjArrary内容”中,我期望所有4个不同的文件名都是"PD.DEVOPS.TEST.1.FS.json","PD.DEVOPS.TEST.1.SFTP.json","PD.DEVOPS.TEST.1.json","PD.DEVOPS.TEST.1_AS2.json“。

请帮助和协助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-27 02:15:13

for (const file of files)for (let file of files)

如果必须在异步调用中访问var,则不能在for循环中使用file关键字。它无法捕获file的确切值。

请尝试在var函数内的第一个for循环中更改doJobsSeqCall,然后再试一次。

票数 1
EN

Stack Overflow用户

发布于 2019-04-27 02:02:52

代码语言:javascript
运行
复制
for (var file of files) {
    var pdObj: axObj = {
        id: "",
        name: "PD.Object",
        body: ""
    };

...
}

请在pdObj循环中声明变量for

为什么?:

如果pdObjfor循环之外,

代码语言:javascript
运行
复制
pdObj = ...
pdObjArray.push(pdObj);

以上代码的意思是:将相同的引用变量pdOjb附加到pdObjArray中。

因此,pdObjArray包含相同的引用数组。

这意味着只显示最后一个值

但是,如果pdObjfor循环中,则每个for loop都要创建pdObj,因此,将不同的引用对象附加到pdObjArray中。

或者您可以在pdObjArray.push(pdObj);之前使用对象克隆。

pdObjArray.push(JSON.parese(JSON.stringfy(pdObj)));

What is the most efficient way to deep clone an object in JavaScript?

票数 1
EN

Stack Overflow用户

发布于 2019-04-27 09:18:43

因为files是一个字符串数组,所以您可以尝试执行foreach,然后执行其中的所有逻辑。

files.forEach(file => { //logic here })

查看Mozilla站点Objects/Array/forEach上的示例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55876507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档