2013-08-28 21 views
26

starając się zobaczyć, czy istnieje funkcja biblioteki javascript, które można scalić wartości dla określonego klucza json dwóch obiektówJak połączyć dwie wartości obiektu poprzez klawisze

var x ={ "student-marks":{'math':1,'physics':5} }; 
var y ={ "student-marks":{'chemistry':3,'history':2} }; 

użyciu $ i $ .merge .extend dając Poniższe wyniki

$.extend({},x,y) leads to { "student-marks":{'chemistry':3,'history':2} } 

$.merge(x,y) leads to { "student-marks":{'math':1,'physics':2} } 

co szukam jest { "student-marks":{'math':1,'physics':5, 'chemistry':3,'history':2} }‍

+2

Po prostu wykonaj ** ręcznie ** za pomocą pętli. Nie wszystko w naszej codziennej pracy można rozwiązać za pomocą wbudowanego wywołania funkcji – zerkms

+4

@zerkms, ale może to być: S – naomik

+0

@naomik: może być, podobnie jak wiele innych rzeczy. Osoba nie może dodać 2 liczb i pytać o rozwiązywanie całek. To nie brzmi dobrze, imho. – zerkms

Odpowiedz

36

chcesz głęboko rozszerzyć

$.extend(true, {}, x, y); 

Zobacz docs dla jQuery.extend([deep], target, object1[, objectN])

+2

Jakie byłoby podobne rozwiązanie dla lodash lub podkreślnika? Mam prawie identyczny problem, ale nie korzystam z jQuery i wolałbym, żeby w domenie _.merge było to możliwe? Oto moje pytanie: http://stackoverflow.com/questions/23186187/merge-two-javascript-objects-if-key-value-isequal – DeBraid

11

Prosta funkcja javascript bez zależności jQuery pomogą scalić dwa obiekt JSON, który obiektów zagnieżdżonych.

function mergeJSON(source1,source2){ 
    /* 
    * Properties from the Souce1 object will be copied to Source2 Object. 
    * Note: This method will return a new merged object, Source1 and Source2 original values will not be replaced. 
    * */ 
    var mergedJSON = Object.create(source2);// Copying Source2 to a new Object 

    for (var attrname in source1) { 
     if(mergedJSON.hasOwnProperty(attrname)) { 
      if (source1[attrname]!=null && source1[attrname].constructor==Object) { 
       /* 
       * Recursive call if the property is an object, 
       * Iterate the object and set all properties of the inner object. 
       */ 
       mergedJSON[attrname] = mergeJSON(source1[attrname], mergedJSON[attrname]); 
      } 

     } else {//else copy the property from source1 
      mergedJSON[attrname] = source1[attrname]; 

     } 
     } 

     return mergedJSON; 
} 
+2

To rozwiązanie nie działa w NodeJS. Musiał zainstalować https://www.npmjs.com/package/extend. – tfmontague

+0

Ten skrypt działa dla prostych obiektów. Aby działał z obiektami zagnieżdżonymi, musiałem nieco zmienić skrypt. Aby działał z tablicami wewnątrz obiektów, wymaga innego bloku kodu. Kiedy zrobię to dobrze, opublikuję to tutaj. –

+0

Nadal czekam na Ciebie @andrewlorien – Leo

0
https://gist.github.com/samad-aghaei/7250ffb74ed80732debb1cbb14d2bfb0 

<pre> 
/** 
This script can merge two multi dimensional associative array/objects in javascript by comparing given object with its reference and 
will remove additional given keys, adding missed parameteres and also validating values without overhead. Also it will return the default values if no input presented with re-usable reference! 
Tested on IE8 and greater. 
**/ 
var module = (function(){ 
    //To make our reference variable onchangable, have to put it into a function which is fster and more efficient than "JSON.parse(JSON.stringify(VARIABLE))" 
    var _defs = function(){ 
      return { 
        //string, number and boolean are actually regex based validation keys on input values. 
       a: ["string", 'Defaul value for "a"'], 
       b: ["number", 300], 
       c: ["boolean", true], 
       d: { 
        da: ["boolean", true], 
        db: ["string", 'Defaul value for "db"'], 
        dc: { 
        dca: ["number", 200], 
        dcb: ["string", 'Default value for "dcb"'], 
        dcc: ["number", 500], 
        dcd: ["boolean", true] 
        }, 
        dce: ["string", 'Default value for "dce"'], 
       }, 
       e: ["number", 200], 
       f: ["boolean", 0], 
       g: ["", 'This is an internal extra parameter'] 
      } 
     } 

     var _validation = { 
       number: function (defaultValue, userValue) { 
        if(/^[0-9]+$/.test(userValue)) //Only numbers allowed 
        return userValue; 
        else return defaultValue; 
       }, 
       string: function (defaultValue, userValue) { 
        if(/^[a-zA-Z\s]*$/.test(userValue)) //Only A to Z case insentitive with space aloowed. 
        return userValue; 
        else return defaultValue; 
       }, 
       boolean: function (defaultValue, userValue) { 
        if(typeof userValue === 'boolean') //True or False or 0 ,1 
        return userValue; 
        else return defaultValue; 
       } 
     } 

     var _uniqueMerge = function(opts, _ref){ 
       for(var key in _ref) 
        if (_ref && _ref[key] && _ref[key].constructor && _ref[key].constructor === Object) 
         _ref[key] = _uniqueMerge((opts ? opts[key] : null), _ref[key]); 
        else if(opts && opts.hasOwnProperty(key)) 
         _ref[key] = _validation[_ref[key][0]](_ref[key][1], opts[key]); //or without validation on user enties => ref[key] = obj[key] 
        else _ref[key] = _ref[key][1]; 
       return _ref; 
     } 
     var _get = function(inputs){ 
      return _uniqueMerge(inputs, _defs()); 
     } 
     return { 
      options: function(){ 
      return _get(arguments[0] || null); // for more safety and control on number of input variables! used --> (arguments[0] || null) 
      } 
     } 
})(); 


//How to use it:  

input_one = { 
    a : "Hello World", 
    //b : ["number", 400], //User missed this parameter 
    c: "Hi", 
    d : { 
     da : false, 
     db : "Hellow! World", // ! is not allowed 
     dc : { 
      dca : 10, 
      dcb : "My String", 
      dcc: "3thString", 
      dcd : false 
     }, 
     dce: "ANOTHER STRING", 
    }, 
    e: 40, 
    f: true, 
    z: 'x' 
}; 
console.log(JSON.stringify(module.options(input_one), null ,2)); 
//Output: 
/* 
{ 
    "a": "Hello World", 
    "b": 300, 
    "c": true, 
    "d": { 
    "da": false, 
    "db": "Defaul value for \"db\"", 
    "dc": { 
     "dca": 10, 
     "dcb": "My String", 
     "dcc": 500, 
     "dcd": false 
    }, 
    "dce": "ANOTHER STRING" 
    }, 
    "e": 40, 
    "f": true, 
    "g": "This is an internal extra parameter" 
} 
*/ 
input_two = { 
    a : 32, 
    //b : ["number", 400], //User missed this parameter 
    c: "Hi", 
    d : { 
     da : false, 
     db : "HelloWorld", 
     dc : { 
      dca : 10, 
      dcb : "My String", 
      dcd : false 
     }, 
     dce: 73, 
    } 
}; 
console.log(JSON.stringify(module.options(input_two), null ,2)); 
//output 
/* 
{ 
    "a": "Defaul value for \"a\"", 
    "b": 300, 
    "c": true, 
    "d": { 
    "da": false, 
    "db": "HelloWorld", 
    "dc": { 
     "dca": 10, 
     "dcb": "My String", 
     "dcc": 500, 
     "dcd": false 
    }, 
    "dce": "Default value for \"dce\"" 
    }, 
    "e": 200, 
    "f": 0, 
    "g": "This is an internal extra parameter" 
} 
*/ 
//Empty input will return the default values! 
console.log(JSON.stringify(module.options(), null ,2));  
//Output 
/* 
{ 
    "a": "Defaul value for \"a\"", 
    "b": 300, 
    "c": true, 
    "d": { 
    "da": true, 
    "db": "Defaul value for \"db\"", 
    "dc": { 
     "dca": 200, 
     "dcb": "Default value for \"dcb\"", 
     "dcc": 500, 
     "dcd": true 
    }, 
    "dce": "Default value for \"dce\"" 
    }, 
    "e": 200, 
    "f": 0, 
    "g": "This is an internal extra parameter" 
} 
*/</pre> 
0

Spróbuj

function mergeJSON(source1,source2){ 
    /* 
    * Properties from the Souce1 object will be copied to Source2 Object. 
    * Note: This method will return a new merged object, Source1 and Source2 original values will not be replaced. 
    * */ 
    var mergedJSON = Object.create(source2);// Copying Source2 to a new Object 

    for (var attrname in source1) { 
     if(mergedJSON.hasOwnProperty(attrname)) { 
      if (source1[attrname]!=null && source1[attrname].constructor==Object) { 
       /* 
       * Recursive call if the property is an object, 
       * Iterate the object and set all properties of the inner object. 
       */ 
       mergedJSON[attrname] = mergeJSON(source1[attrname], mergedJSON[attrname]); 
      } 

     } else {//else copy the property from source1 
      mergedJSON[attrname] = source1[attrname]; 

     } 
     } 

     return mergedJSON; 
} 
0

Nieco mniej gadatliwy.

answer = { "student-marks": Object.assign(x['student-marks'], y['student-marks']) } 
  • ostrzeżenie to nie ma skutków ubocznych na X.
Powiązane problemy