在JavaScript中的函数中重写JSON对象

时间:2016-06-11 15:09:16

标签: javascript json

我正在尝试将我的简历复制到另一个对象中,并将其更改为希腊语(以查看我的html布局将如何显示)。我的问题是,当我通过函数传递我的简历时,它会以某种方式在函数外部变为希腊语。任何帮助,将不胜感激。我在简历上更改了我的信息,但格式是一样的。我们不允许使用任何其他JS库。该函数是greekingResume()。这是代码:

<script>
    let resume = {
        "personalInfo": {
            "firstName": "Bob",
            "lastName": Ross",
            "contactInfo": {
                "address": {
                    "city": "Somewhere",
                    "state": "USA"
                },
                "phoneNumber": "454-555-5555",
                "email": "somedude@gsomeemail.com"
            }
        },
        "education": {
            "degree": "Bachelors of Computer Science",
            "gradDate": "May 2018",
            "schoolInfo": {
                "school": "Some University",
                "city": "Somewhere",
                "state": "USA",
                "relatedCourses": {
                    "programming": [
                        "Fundamentals of Programming",
                        "Object Oriented Programming",
                        "Operating Systems Theory",
                        "C++ Software Development",
                        "Patterns of Software Development"
                    ],
                    "computerScience": [
                        "Discrete Structures",
                        "Introduction to Algorithms and Data Structures",
                        "Computer Networks",
                        "Computer Organization and Architecture",
                        "Introduction to Algorithms",
                        "Database Theory",
                        "Introduction to Computation Theory"
                    ]
                }
            }
        },
        "skills": [{
            "title": "programming",
            "skillSet": [
                "Proficient with C++, C#, C. Familiar with Java, angularJS and HTML/CSS",
                "Designed User Interface changes and applications using Java for a company's product, helped create software that uses an angularJS application to communicate and display data from a Jasper REST server",
                "Designed a Virtual Machine that can use multithreading without the threading library, a Stack, a Graph, a Word  Counting program, and more that all fit to professors specifications"
            ]
        }, {
            "title": "management",
            "skillSet": [
                "Supervise a team of nine employees: oversee daily tasks, shift assignments and area coverage",
                "Coordinate between team members to increase productivity, identifying key strengths and abilities to match job tasks",
                "Utilize time effectively to maintain a standard of duties, resulting in promotion to lead custodian over two buildings"
            ]
        }, {
            "title": "communication",
            "skillSet": [
                "Communicated between team members and manager to ensure project was on track",
                "Provide feedback between managers and employees to ensure a standards of cleaning, employee performance, and other general information or instructions",
                "Increased employee productivity by effectively relaying instructions, resulting in extra time to focus on ancillary work"
            ]
        }, {
            "title": "organization & training",
            "skillSet": [
                "Complete tasks in a timely manner and resolve unexpected issues quickly",
                "Trained others on how to effectively complete tasks to streamline workflow",
                "Quickly learns a new skill and adapt easily to change and improvement"
            ]
        }],
        "experience": [{
            "title": "Software Developer",
            "company": "Cool Current Company",
            "workStartDate": "April 2016",
            "workEndDate": "Present",
            "location": {
                "city": "Somewhere Else",
                "state": "USA"
            }
        }, {
            "title": "Software Developer",
            "company": "SuperDuper Co",
            "workStartDate": "March 2015",
            "workEndDate": "December 2015",
            "location": {
                "city": "Nowhere",
                "state": "USA"
            }
        }, {
            "title": "Sandwich Artist",
            "company": "Sandwich shop",
            "workStartDate": "January 2015",
            "workEndDate": "March 2015",
            "location": {
                "city": "Somewhere",
                "state": "USA"
            }
        }, {
            "title": "Lead Custodian",
            "company": "Some University",
            "workStartDate": "August 2011",
            "workEndDate": "January 2015",
            "location": {
                "city": "Somewhere",
                "state": "USA"
            }
        }]
    };
    let greekWords = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris at ex eu turpis lacinia dapibus. Mauris sed porttitor odio, id efficitur nisi. Proin vitae velit iaculis, posuere ante vel, venenatis sem. Integer lorem nulla, tempor id nibh eget, faucibus finibus ante. Pellentesque tempus dictum sapien, quis vulputate enim pharetra sit amet. Nullam nibh lorem, aliquet et ullamcorper in, commodo eget nibh. Suspendisse condimentum massa vel ex varius, a finibus risus rutrum. Vivamus interdum vulputate est, sit amet viverra nisi mattis vitae. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Morbi vel posuere elit, et sagittis ex. Phasellus dictum eu urna tristique porta. Suspendisse efficitur, diam sed porttitor auctor, augue ipsum cursus mi, nec congue neque elit in nisl. Ut a ipsum bibendum, auctor lectus et, feugiat augue. Suspendisse sit amet nulla dapibus, euismod nunc sed, pretium libero. Aenean maximus elit sed lacus accumsan, et ullamcorper ante hendrerit. Aliquam accumsan nunc nulla, non ornare leo semper sed. Etiam tristique scelerisque tincidunt. Nullam venenatis congue mollis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer neque diam, pulvinar eget accumsan in, hendrerit vel dolor. Suspendisse maximus fringilla ultricies. Donec ac maximus augue. Etiam neque ligula, aliquam eu ligula vel, malesuada sodales lorem. Aenean orci augue, pulvinar sed sodales nec, maximus sit amet ex. Mauris rutrum augue eu magna finibus facilisis. Duis vel ligula enim. Nam non augue orci. Nullam facilisis, nibh eget lacinia dapibus, sem nisl tempus nisi, non consectetur ligula mauris et felis. Suspendisse potenti. Integer convallis ullamcorper molestie. Maecenas sit amet tincidunt velit, nec accumsan erat. Nam at scelerisque augue. Phasellus porta lectus vitae nisi aliquam, quis laoreet tellus tristique. Duis vehicula odio a velit commodo tempus. Duis condimentum, lectus sed tempor imperdiet, velit sem vulputate arcu, et pretium enim ante vitae lorem. Aenean ut hendrerit augue. Fusce ultricies posuere nisi. Pellentesque nec turpis nisi. Nulla sodales feugiat arcu eget ultrices. Cras sem velit, maximus ut neque in, scelerisque cursus mauris. Pellentesque mauris lectus, congue non erat vel, dictum commodo diam. Cras sed augue nec ipsum convallis dignissim at et risus. Fusce condimentum placerat porttitor. Vestibulum ante ante, tincidunt at tristique eget, suscipit quis ipsum. Vivamus iaculis euismod libero id laoreet. Quisque leo felis, placerat sit amet placerat at, sodales in quam. Nunc vulputate, sapien id commodo fringilla, ex ante laoreet nunc, in mattis diam magna ut sapien. Pellentesque scelerisque tortor justo, ut venenatis nibh malesuada nec. Donec non commodo magna, sed posuere magna. Morbi imperdiet nisl non luctus rhoncus. Phasellus id mi sed tellus dignissim efficitur accumsan quis ex. Interdum et malesuada fames ac ante ipsum primis in faucibus. Fusce sed scelerisque tellus, a aliquam leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras sed dolor at augue vehicula rhoncus. Sed ultrices, quam eget faucibus placerat, nulla dui imperdiet urna, vel suscipit dui ex vitae quam. Maecenas magna ligula, vulputate sed purus nec, laoreet tempor massa. Ut eu purus vulputate, faucibus tellus sed, accumsan massa. Sed vestibulum eleifend risus, sed tempus sem varius at. Praesent viverra vel urna vel luctus. Morbi dui ipsum, semper vitae congue quis, vulputate id quam. Donec quis gravida purus.";

    function greekingResume(data, greekWords) {
        let greekObj = {
            arr: greekWords.split(/[^A-Za-z]+/),
            index: 0
        };
        function greekHelper(obj, greekObj) {
            for (let property in obj) {
                if (typeof(obj[property]) === "object") {
                    obj[property] = greekHelper(obj[property], greekObj);
                } else {
                    obj[property] = obj[property].replace(/[A-Za-z]+/g, (function() {
                        return function(matching) {
                            let greekWord = greekObj.arr[greekObj.index++ % greekObj.arr.length];
                            if (matching[0].match(/[A-Z]/)) {
                                if (matching[1] && matching[1].match(/[A-Z]/)) {
                                    greekWord = greekWord.toUpperCase();
                                } else {
                                    greekWord = greekWord[0].toUpperCase() + greekWord.slice(1);
                                }
                            }
                            return greekWord;
                        };
                    }()));
                }
            }
            return obj;
        }
        return greekHelper(data, greekObj);
    }
    let greekedResume = greekingResume(resume, greekWords);

感谢您抽出时间来看看这个!

1 个答案:

答案 0 :(得分:1)

<强>编辑:

好了,现在我测试了你的脚本,resume也被改变的原因是因为在javascript中将一个变量传递给一个函数已经为传递的参数“赋值”一个新的值,就像你使用等号(=)。会发生什么事情:

resume = obj //obj inside your greekHelper function

正是在这些行上你的resume发生了变异:

obj[property] = greekHelper(obj[property], greekObj);

obj[property] = obj[property].replace(/[A-Za-z]+/g, (function() {

因此,为了避免这种情况,请更改代码的这一部分以添加newObj并将变异值分配给新对象并返回该newObj:

        var newObj = {};
        for (let property in obj) {

            if (typeof(obj[property]) === "object") {
                newObj[property] = greekHelper(obj[property], greekObj);
            } else {
                newObj[property] = obj[property].replace(/[A-Za-z]+/g, (function() {

这是一个适合你的小提琴 http://jsbin.com/rotuhap/edit?js,console,output

以下是您的好读物:Is JavaScript a pass-by-reference or pass-by-value language?

<强> IGNORE: 您可以将let resume更改为var resumeresume也已更新,因为您使用了letlet绑定了新的价值,而不是保持旧的参考值。

以下是对letvar的好读:

<德尔> “let” keyword vs “var” keyword

有关使用let的详细信息,请查看let

的此文档