简体   繁体   中英

Jquery Javascript object - compare and replace some of the values with another similar object

There is an Javascript object (formData) that I need to replace some of the values by comparing with another object (dataObject). The JSON for both objects is below. Now what I need is, snippet:

Main formData Object:

{
                "name": "abNotes",
                "label": "Ab Notes: (Optional)",
                "type": "TEXT_BOX_SINGLE",
                "value": "Example Notes",
                "active": true
}

I need to compare the "value" to the other dataObject by "name" property and replace if it's different.

dataObject to compare to:

{
        "name": "abNotes",
        "value": "Example Notes 123456"
}

So the replaced FormData object will be changed to:

{
                    "name": "abNotes",
                    "label": "Ab Notes: (Optional)",
                    "type": "TEXT_BOX_SINGLE",
                    "value": "Example Notes 123456",
                    "active": true
}

Main object that needs to be replaced

JSON.stringify (formData);

form data::
{
    "name": "Demo",
    "fieldGroupList": [{
        "name": "instructions",
        "label": "Instructions",
        "fieldList": [{
            "name": "INSTRUCTION",
            "instructionList": [{
                "instructionText": "All enabled fields are required."
            }],
            "type": "INSTRUCTION"
        }]
    },
    {
        "name": "ab",
        "label": "Ab",
        "fieldList": [{
            "name": "abDate",
            "label": "Ab Date",
            "type": "DATE",
            "value": "1425186000000",
            "active": true
        },
        {
            "name": "abNotes",
            "label": "Ab Notes: (Optional)",
            "type": "TEXT_BOX_SINGLE",
            "value": "Example Notes",
            "active": true
        }]
    },
    {
        "name": "Record",
        "label": "Record",
        "fieldList": [{
            "name": "RecordNumber",
            "label": "Record Number: (Optional)",
            "type": "TEXT_BOX_SINGLE",
            "value": "1234567890",
            "active": true
        },
        {
            "name": "otherNumber",
            "label": "Other: (Optional)",
            "type": "TEXT_BOX_SINGLE",
            "value": "887766",
            "active": true
        },
        {
            "name": "eligibleAll",
            "instructionList": [{
                "instructionText": "Is eligible for ALL?"
            }],
            "type": "SINGLE_FROM_SET",
            "value": "true",
            "optionList": [{
                "name": "Yes",
                "value": "true"
            },
            {
                "name": "No",
                "value": "false"
            }],
            "active": true
        },
        {
            "name": "exclusionReasonCode",
            "instructionList": [{
                "instructionText": "Select from the following list of sample:"
            }],
            "type": "SINGLE_FROM_SET",
            "value": "DCS",
            "optionList": [{
                "name": "DCS",
                "value": "Test"
            }],
            "active": true
        }]
    },
    {
        "name": "bDemo",
        "label": "Demo",
        "fieldList": [{
            "name": "mId",
            "label": "M ID:",
            "type": "TEXT_BOX_SINGLE",
            "active": false
        },
        {
            "name": "firstName",
            "label": "First Name:",
            "type": "TEXT_BOX_SINGLE",
            "value": "John",
            "active": true
        },
        {
            "name": "lastName",
            "label": "Last Name",
            "type": "TEXT_BOX_SINGLE",
            "value": "Doe",
            "active": true
        },
        {
            "name": "genderCode",
            "instructionList": [{
                "instructionText": "Gender:"
            }],
            "type": "SINGLE_FROM_SET",
            "optionList": [{
                "name": "FEMALE",
                "value": "FEMALE"
            },
            {
                "name": "MALE",
                "value": "MALE"
            },
            {
                "name": "UNKNOWN",
                "value": "UNKNOWN"
            }],
            "active": true
        },
        {
            "name": "dateOfBirth",
            "label": "Date of Birth:",
            "type": "DATE",
            "value": "-157748400000",
            "active": true
        }]
    },
    {
        "name": "generalComments",
        "label": "General Comments",
        "fieldList": [{
            "name": "comments",
            "label": "Comments: (Optional)",
            "type": "TEXT_BOX_MULTIPLE",
            "value": "Comments Text Example",
            "active": true
        }]
    }],
    "Id": 1,
    "periodId": 2015,
    "orgId": 4,
    "version": 1
}

The values that I need from this object:

var dataObject = $('#'+formName).serializeArray();
console.log("data:::"+JSON.stringify(dataObject));

dataObject:::
[{
    "name": "abDate",
    "value": "Sun Mar 01 2015 00:00:00 GMT-0500 (Eastern Standard Time)"
},
{
    "name": "abNotes",
    "value": "Example Notes 123456"
},
{
    "name": "Number",
    "value": "1234567890"
},
{
    "name": "otherNumber",
    "value": "887766"
},
{
    "name": "Yes",
    "value": "true"
},
{
    "name": "No",
    "value": "false"
},
{
    "name": "DCS",
    "value": "Test"
},
{
    "name": "firstName",
    "value": "John"
},
{
    "name": "lastName",
    "value": "Doe"
},
{
    "name": "FEMALE",
    "value": "FEMALE"
},
{
    "name": "MALE",
    "value": "MALE"
},
{
    "name": "UNKNOWN",
    "value": "UNKNOWN"
},
{
    "name": "dateOfBirth",
    "value": "Fri Jan 01 1965 00:00:00 GMT-0500 (Eastern Standard Time)"
},
{
    "name": "comments",
    "value": "Comments Text Example"
}]

EDIT:

What I have tried so far:

  1. $.extend(formData ,dataObject);

  2. deepCopy:

function deepCopy(src, dest) { var name, value, isArray, toString = Object.prototype.toString;

// If no `dest`, create one
if (!dest) {
    isArray = toString.call(src) === "[object Array]";
    if (isArray) {
        dest = [];
        dest.length = src.length;
    }
    else { // You could have lots of checks here for other types of objects
        dest = {};
    }
}

// Loop through the props
for (name in src) {
    // If you don't want to copy inherited properties, add a `hasOwnProperty` check here
    // In our case, we only do that for arrays, but it depends on your needs
    if (!isArray || src.hasOwnProperty(name)) {
        value = src[name];
        if (typeof value === "object") {
            // Recurse
            value = deepCopy(value);
        }
        dest[name] = value;
    }
}

return dest;

}

First, convert dataObject from an array of objects to an object that maps names to values. Then go through the main form data, replacing values from the corresponding elements of doHash .

 var formData = { "name": "Demo", "fieldGroupList": [{ "name": "instructions", "label": "Instructions", "fieldList": [{ "name": "INSTRUCTION", "instructionList": [{ "instructionText": "All enabled fields are required." }], "type": "INSTRUCTION" }] }, { "name": "ab", "label": "Ab", "fieldList": [{ "name": "abDate", "label": "Ab Date", "type": "DATE", "value": "1425186000000", "active": true }, { "name": "abNotes", "label": "Ab Notes: (Optional)", "type": "TEXT_BOX_SINGLE", "value": "Example Notes", "active": true }] }, { "name": "Record", "label": "Record", "fieldList": [{ "name": "RecordNumber", "label": "Record Number: (Optional)", "type": "TEXT_BOX_SINGLE", "value": "1234567890", "active": true }, { "name": "otherNumber", "label": "Other: (Optional)", "type": "TEXT_BOX_SINGLE", "value": "887766", "active": true }, { "name": "eligibleAll", "instructionList": [{ "instructionText": "Is eligible for ALL?" }], "type": "SINGLE_FROM_SET", "value": "true", "optionList": [{ "name": "Yes", "value": "true" }, { "name": "No", "value": "false" }], "active": true }, { "name": "exclusionReasonCode", "instructionList": [{ "instructionText": "Select from the following list of sample:" }], "type": "SINGLE_FROM_SET", "value": "DCS", "optionList": [{ "name": "DCS", "value": "Test" }], "active": true }] }, { "name": "bDemo", "label": "Demo", "fieldList": [{ "name": "mId", "label": "M ID:", "type": "TEXT_BOX_SINGLE", "active": false }, { "name": "firstName", "label": "First Name:", "type": "TEXT_BOX_SINGLE", "value": "John", "active": true }, { "name": "lastName", "label": "Last Name", "type": "TEXT_BOX_SINGLE", "value": "Doe", "active": true }, { "name": "genderCode", "instructionList": [{ "instructionText": "Gender:" }], "type": "SINGLE_FROM_SET", "optionList": [{ "name": "FEMALE", "value": "FEMALE" }, { "name": "MALE", "value": "MALE" }, { "name": "UNKNOWN", "value": "UNKNOWN" }], "active": true }, { "name": "dateOfBirth", "label": "Date of Birth:", "type": "DATE", "value": "-157748400000", "active": true }] }, { "name": "generalComments", "label": "General Comments", "fieldList": [{ "name": "comments", "label": "Comments: (Optional)", "type": "TEXT_BOX_MULTIPLE", "value": "Comments Text Example", "active": true }] }], "Id": 1, "periodId": 2015, "orgId": 4, "version": 1 }; var dataObject = [{ "name": "abDate", "value": "Sun Mar 01 2015 00:00:00 GMT-0500 (Eastern Standard Time)" }, { "name": "abNotes", "value": "Example Notes 123456" }, { "name": "Number", "value": "1234567890" }, { "name": "otherNumber", "value": "887766" }, { "name": "Yes", "value": "true" }, { "name": "No", "value": "false" }, { "name": "DCS", "value": "Test" }, { "name": "firstName", "value": "John" }, { "name": "lastName", "value": "Doe" }, { "name": "FEMALE", "value": "FEMALE" }, { "name": "MALE", "value": "MALE" }, { "name": "UNKNOWN", "value": "UNKNOWN" }, { "name": "dateOfBirth", "value": "Fri Jan 01 1965 00:00:00 GMT-0500 (Eastern Standard Time)" }, { "name": "comments", "value": "Comments Text Example" }]; var doHash = {}; $.each(dataObject, function() { doHash[this.name] = this.value; }); $.each(formData.fieldGroupList, function() { $.each(this.fieldList, function() { if (this.name in doHash) { this.value = doHash[this.name]; } }); }); console.log(JSON.stringify(formData)); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM