2016-08-04 53 views
1

你好,所以我現在合併的問題是我的數據庫有兩個變量,我不幸地不能改變變量的名稱,以手動匹配對方。因此,我想知道如果我可以以某種方式修改jquery的合併來結合兩個對象並將變量添加到一起忽略大小寫。我如何使用lodash合併來結合具有不同外殼的屬性

如:

var object = { 
'a': [ { 'b':2 }, {'d':4}] 
}; 

var other = { 
'A': [{'c': 3}, {'e':5}] 
}; 

_.merge(object, other); 
// -> {'a': [{'b': 2, 'c':3}, {'d':4, 'e':5}] } 

目前的合併方法在我們的lodash庫:

/** 
    * Recursively merges own enumerable properties of the source object(s), that 
    * don't resolve to `undefined` into the destination object. Subsequent sources 
    * will overwrite property assignments of previous sources. If a callback is 
    * provided it will be executed to produce the merged values of the destination 
    * and source properties. If the callback returns `undefined` merging will 
    * be handled by the method instead. The callback is bound to `thisArg` and 
    * invoked with two arguments; (objectValue, sourceValue). 
    * 
    * @static 
    * @memberOf _ 
    * @category Objects 
    * @param {Object} object The destination object. 
    * @param {...Object} [source] The source objects. 
    * @param {Function} [callback] The function to customize merging properties. 
    * @param {*} [thisArg] The `this` binding of `callback`. 
    * @returns {Object} Returns the destination object. 
    * @example 
    * 
    * var names = { 
    * 'characters': [ 
    *  { 'name': 'barney' }, 
    *  { 'name': 'fred' } 
    * ] 
    * }; 
    * 
    * var ages = { 
    * 'characters': [ 
    *  { 'age': 36 }, 
    *  { 'age': 40 } 
    * ] 
    * }; 
    * 
    * _.merge(names, ages); 
    * // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] } 
    * 
    * var food = { 
    * 'fruits': ['apple'], 
    * 'vegetables': ['beet'] 
    * }; 
    * 
    * var otherFood = { 
    * 'fruits': ['banana'], 
    * 'vegetables': ['carrot'] 
    * }; 
    * 
    * _.merge(food, otherFood, function(a, b) { 
    * return _.isArray(a) ? a.concat(b) : undefined; 
    * }); 
    * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot] } 
    */ 
     var args = arguments, 
     length = 2; 

     if (!isObject(object)) { 
     return object; 
     } 
     // allows working with `_.reduce` and `_.reduceRight` without using 
     // their `index` and `collection` arguments 
     if (typeof args[2] != 'number') { 
     length = args.length; 
     } 
     if (length > 3 && typeof args[length - 2] == 'function') { 
     var callback = baseCreateCallback(args[--length - 1], args[length--], 2); 
     } else if (length > 2 && typeof args[length - 1] == 'function') { 
     callback = args[--length]; 
     } 
     var sources = slice(arguments, 1, length), 
     index = -1, 
     stackA = getArray(), 
     stackB = getArray(); 

     while (++index < length) { 
     baseMerge(object, sources[index], callback, stackA, stackB); 
     } 
     releaseArray(stackA); 
     releaseArray(stackB); 
     return object; 

    }; 

謝謝大家的時間尋找到這跟我來!

+0

將你總是會處理兩個結果 - 例如「A」和「A」或'B'和'b'? – abigwonderful

+0

您是否希望密鑰始終是小寫字母,是否重要,還是需要保持原始對象的情況? – tsturzl

+0

@tsturzl我需要保持從原始對象的情況下,不可能是多個結果。 –

回答

0

我開始服用這種方式太深刻了,但不知道是否該轉換特性爲小寫的簡單功能可以幫助:

var obj1 = { 
'a': [ { 'b':2 }, {'d':4}] 
}; 

var obj2 = { 
'A': [{'c': 3}, {'e':5}] 
}; 

function propsToLower(obj){ 
    var newObj ={}; 
    for(var item in obj){ 
     newObj[item.toLowerCase()] = obj[item]; 
    } 
    return newObj; 
} 

var newObj1 = propsToLower(obj1); 
var newObj2 = propsToLower(obj2); 

_.merge(newObj1, newObj2); 
+0

看起來很棒!我只需要知道是否可以將屬性中的套管更改爲小寫,或者將其中一個原始套管保留在其中一個對象上。同時,儘管非常感謝你向正確的方向推進= D –

+0

是的,如果你知道一個將始終是小寫,那麼不需要在兩者上運行該功能。只是想確定。 – abigwonderful

+0

@BenJohnson這是我正在建議的,但你說:「我需要保持原始對象的情況下」。如果你想保留第一個對象的原始案例,你將不得不做更多的事情,並且可能會編寫你自己的'merge'方法。 – tsturzl

相關問題