(feature) Add _.mergeWith

This commit is contained in:
DomiR
2016-01-23 14:52:57 +01:00
parent 242f39f735
commit 0d6bd79475
2 changed files with 213 additions and 99 deletions
+39 -45
View File
@@ -8421,32 +8421,19 @@ module TestMerge {
type ExpectedResult = { a: number, b: string };
let result: ExpectedResult;
let customizer: (value: any, srcValue: any, key?: string, object?: InitialValue, source?: MergingValue) => any;
// Test for basic merging
result = _.merge(initialValue, mergingValue);
result = _.merge(initialValue, mergingValue, customizer);
result = _.merge(initialValue, mergingValue, customizer, any);
result = _.merge(initialValue, {}, mergingValue);
result = _.merge(initialValue, {}, mergingValue, customizer);
result = _.merge(initialValue, {}, mergingValue, customizer, any);
result = _.merge(initialValue, {}, {}, mergingValue);
result = _.merge(initialValue, {}, {}, mergingValue, customizer);
result = _.merge(initialValue, {}, {}, mergingValue, customizer, any);
result = _.merge(initialValue, {}, {}, {}, mergingValue);
result = _.merge(initialValue, {}, {}, {}, mergingValue, customizer);
result = _.merge(initialValue, {}, {}, {}, mergingValue, customizer, any);
// Once we get to the varargs version, you have to specify the result explicitly
result = _.merge<ExpectedResult>(initialValue, {}, {}, {}, {}, mergingValue);
result = _.merge<ExpectedResult>(initialValue, {}, {}, {}, {}, mergingValue, customizer);
result = _.merge<ExpectedResult>(initialValue, {}, {}, {}, {}, mergingValue, customizer, any);
// Test for multiple combinations of many types
type ComplicatedExpectedType = { a: number, b: string, c: {}, d: number[], e: boolean };
@@ -8468,25 +8455,15 @@ module TestMerge {
// Tests for basic chaining with merge
result = _(initialValue).merge(mergingValue).value();
result = _(initialValue).merge(mergingValue, customizer).value();
result = _(initialValue).merge(mergingValue, customizer, any).value();
result = _(initialValue).merge({}, mergingValue).value();
result = _(initialValue).merge({}, mergingValue, customizer).value();
result = _(initialValue).merge({}, mergingValue, customizer, any).value();
result = _(initialValue).merge({}, {}, mergingValue).value();
result = _(initialValue).merge({}, {}, mergingValue, customizer).value();
result = _(initialValue).merge({}, {}, mergingValue, customizer, any).value();
result = _(initialValue).merge({}, {}, {}, mergingValue).value();
result = _(initialValue).merge({}, {}, {}, mergingValue, customizer).value();
result = _(initialValue).merge({}, {}, {}, mergingValue, customizer, any).value();
// Once we get to the varargs version, you have to specify the result explicitly
result = _(initialValue).merge<ExpectedResult>({}, {}, {}, {}, mergingValue).value();
result = _(initialValue).merge<ExpectedResult>({}, {}, {}, {}, mergingValue, customizer).value();
result = _(initialValue).merge<ExpectedResult>({}, {}, {}, {}, mergingValue, customizer, any).value();
// Test complex multiple combinations with chaining
@@ -8504,41 +8481,58 @@ module TestMerge {
{
let result: _.LoDashExplicitObjectWrapper<ExpectedResult>;
result = _(initialValue).chain().merge(mergingValue);
result = _(initialValue).chain().merge(mergingValue, customizer);
result = _(initialValue).chain().merge(mergingValue, customizer, any);
result = _(initialValue).chain().merge({}, mergingValue);
result = _(initialValue).chain().merge({}, mergingValue, customizer);
result = _(initialValue).chain().merge({}, mergingValue, customizer, any);
result = _(initialValue).chain().merge({}, {}, mergingValue);
result = _(initialValue).chain().merge({}, {}, mergingValue, customizer);
result = _(initialValue).chain().merge({}, {}, mergingValue, customizer, any);
result = _(initialValue).chain().merge({}, {}, {}, mergingValue);
result = _(initialValue).chain().merge({}, {}, {}, mergingValue, customizer);
result = _(initialValue).chain().merge({}, {}, {}, mergingValue, customizer, any);
result = _(initialValue).chain().merge<ExpectedResult>({}, {}, {}, {}, mergingValue);
result = _(initialValue).chain().merge<ExpectedResult>({}, {}, {}, {}, mergingValue, customizer);
result = _(initialValue).chain().merge<ExpectedResult>({}, {}, {}, {}, mergingValue, customizer, any);
// result = _(initialValue).chain().merge(mergingValue);
// result = _(initialValue).chain().merge({}, mergingValue);
// result = _(initialValue).chain().merge({}, {}, mergingValue);
// result = _(initialValue).chain().merge({}, {}, {}, mergingValue);
// result = _(initialValue).chain().merge<ExpectedResult>({}, {}, {}, {}, mergingValue);
}
{
let result: _.LoDashExplicitObjectWrapper<ComplicatedExpectedType>;
result = _({ a: 1 }).chain().merge({ b: "string" }, { c: {} }, { d: [1] }, { e: true });
//result = _({ a: 1 }).chain().merge({ b: "string" }, { c: {} }, { d: [1] }, { e: true });
}
{
let result: _.LoDashExplicitObjectWrapper<ExpectedTypeAfterOverriding>;
result = _({ a: 1 }).chain().merge({ a: "string" }, { a: {} }, { a: [1] }, { a: true });
//result = _({ a: 1 }).chain().merge({ a: "string" }, { a: {} }, { a: [1] }, { a: true });
}
}
// _.mergeWith
module TestMergeWith {
type InitialValue = { a : number };
type MergingValue = { b : string };
var initialValue = { a : 1 };
var mergingValue = { b : "hi" };
type ExpectedResult = { a: number, b: string };
let result: ExpectedResult;
let customizer: (value: any, srcValue: any, key?: string, object?: InitialValue, source?: MergingValue) => any;
// Test for basic merging
result = _.mergeWith(initialValue, mergingValue, customizer);
result = _.mergeWith(initialValue, {}, mergingValue, customizer);
result = _.mergeWith(initialValue, {}, {}, mergingValue, customizer);
result = _.mergeWith(initialValue, {}, {}, {}, mergingValue, customizer);
// Once we get to the varargs version, you have to specify the result explicitl
result = _.mergeWith<ExpectedResult>(initialValue, {}, {}, {}, {}, mergingValue, customizer);
// Tests for basic chaining with mergeWith
result = _(initialValue).mergeWith(mergingValue, customizer).value();
result = _(initialValue).mergeWith({}, mergingValue, customizer).value();
result = _(initialValue).mergeWith({}, {}, mergingValue, customizer).value();
result = _(initialValue).mergeWith({}, {}, {}, mergingValue, customizer).value();
// Once we get to the varargs version, you have to specify the result explicitl
result = _(initialValue).mergeWith<ExpectedResult>({}, {}, {}, {}, mergingValue, customizer).value();
}
// _.omit
module TestOmit {
let predicate: (element: any, key: string, collection: any) => boolean;
+174 -54
View File
@@ -105,7 +105,7 @@ added 13 object methods:
- [x] _.functionsIn
- [x] _.hasIn
- [ ] _.invoke
- [ ] _.mergeWith
- [x] _.mergeWith
- [x] _.omitBy
- [x] _.pickBy
- [ ] _.setWith
@@ -13500,29 +13500,39 @@ declare module _ {
}
//_.merge
interface MergeCustomizer {
(value: any, srcValue: any, key?: string, object?: Object, source?: Object): any;
}
interface LoDashStatic {
/**
* Recursively merges own enumerable properties of the source object(s), that dont resolve to undefined into
* the destination object. Subsequent sources overwrite property assignments of previous sources. If customizer
* is provided its invoked to produce the merged values of the destination and source properties. If
* customizer returns undefined merging is handled by the method instead. The customizer is bound to thisArg
* and invoked with five arguments: (objectValue, sourceValue, key, object, source).
* Recursively merges own and inherited enumerable properties of source
* objects into the destination object, skipping source properties that resolve
* to `undefined`. Array and plain object properties are merged recursively.
* Other objects and value types are overridden by assignment. Source objects
* are applied from left to right. Subsequent sources overwrite property
* assignments of previous sources.
*
* @param object The destination object.
* @param source The source objects.
* @param customizer The function to customize assigned values.
* @param thisArg The this binding of customizer.
* @return Returns object.
* **Note:** This method mutates `object`.
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The destination object.
* @param {...Object} [sources] The source objects.
* @returns {Object} Returns `object`.
* @example
*
* var users = {
* 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
* };
*
* var ages = {
* 'data': [{ 'age': 36 }, { 'age': 40 }]
* };
*
* _.merge(users, ages);
* // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
*/
merge<TObject, TSource>(
object: TObject,
source: TSource,
customizer?: MergeCustomizer,
thisArg?: any
source: TSource
): TObject & TSource;
/**
@@ -13531,9 +13541,7 @@ declare module _ {
merge<TObject, TSource1, TSource2>(
object: TObject,
source1: TSource1,
source2: TSource2,
customizer?: MergeCustomizer,
thisArg?: any
source2: TSource2
): TObject & TSource1 & TSource2;
/**
@@ -13543,9 +13551,7 @@ declare module _ {
object: TObject,
source1: TSource1,
source2: TSource2,
source3: TSource3,
customizer?: MergeCustomizer,
thisArg?: any
source3: TSource3
): TObject & TSource1 & TSource2 & TSource3;
/**
@@ -13556,9 +13562,7 @@ declare module _ {
source1: TSource1,
source2: TSource2,
source3: TSource3,
source4: TSource4,
customizer?: MergeCustomizer,
thisArg?: any
source4: TSource4
): TObject & TSource1 & TSource2 & TSource3 & TSource4;
/**
@@ -13575,9 +13579,7 @@ declare module _ {
* @see _.merge
*/
merge<TSource>(
source: TSource,
customizer?: MergeCustomizer,
thisArg?: any
source: TSource
): LoDashImplicitObjectWrapper<T & TSource>;
/**
@@ -13585,9 +13587,7 @@ declare module _ {
*/
merge<TSource1, TSource2>(
source1: TSource1,
source2: TSource2,
customizer?: MergeCustomizer,
thisArg?: any
source2: TSource2
): LoDashImplicitObjectWrapper<T & TSource1 & TSource2>;
/**
@@ -13596,9 +13596,7 @@ declare module _ {
merge<TSource1, TSource2, TSource3>(
source1: TSource1,
source2: TSource2,
source3: TSource3,
customizer?: MergeCustomizer,
thisArg?: any
source3: TSource3
): LoDashImplicitObjectWrapper<T & TSource1 & TSource2 & TSource3>;
/**
@@ -13608,9 +13606,7 @@ declare module _ {
source1: TSource1,
source2: TSource2,
source3: TSource3,
source4: TSource4,
customizer?: MergeCustomizer,
thisArg?: any
source4: TSource4
): LoDashImplicitObjectWrapper<T & TSource1 & TSource2 & TSource3 & TSource4>;
/**
@@ -13626,9 +13622,7 @@ declare module _ {
* @see _.merge
*/
merge<TSource>(
source: TSource,
customizer?: MergeCustomizer,
thisArg?: any
source: TSource
): LoDashExplicitObjectWrapper<T & TSource>;
/**
@@ -13636,9 +13630,7 @@ declare module _ {
*/
merge<TSource1, TSource2>(
source1: TSource1,
source2: TSource2,
customizer?: MergeCustomizer,
thisArg?: any
source2: TSource2
): LoDashExplicitObjectWrapper<T & TSource1 & TSource2>;
/**
@@ -13647,21 +13639,13 @@ declare module _ {
merge<TSource1, TSource2, TSource3>(
source1: TSource1,
source2: TSource2,
source3: TSource3,
customizer?: MergeCustomizer,
thisArg?: any
source3: TSource3
): LoDashExplicitObjectWrapper<T & TSource1 & TSource2 & TSource3>;
/**
* @see _.merge
*/
merge<TSource1, TSource2, TSource3, TSource4>(
source1: TSource1,
source2: TSource2,
source3: TSource3,
source4: TSource4,
customizer?: MergeCustomizer,
thisArg?: any
): LoDashExplicitObjectWrapper<T & TSource1 & TSource2 & TSource3 & TSource4>;
/**
@@ -13672,6 +13656,142 @@ declare module _ {
): LoDashExplicitObjectWrapper<TResult>;
}
//_.mergeWith
interface MergeWithCustomizer {
(value: any, srcValue: any, key?: string, object?: Object, source?: Object): any;
}
interface LoDashStatic {
/**
* This method is like `_.merge` except that it accepts `customizer` which
* is invoked to produce the merged values of the destination and source
* properties. If `customizer` returns `undefined` merging is handled by the
* method instead. The `customizer` is invoked with seven arguments:
* (objValue, srcValue, key, object, source, stack).
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The destination object.
* @param {...Object} sources The source objects.
* @param {Function} customizer The function to customize assigned values.
* @returns {Object} Returns `object`.
* @example
*
* function customizer(objValue, srcValue) {
* if (_.isArray(objValue)) {
* return objValue.concat(srcValue);
* }
* }
*
* var object = {
* 'fruits': ['apple'],
* 'vegetables': ['beet']
* };
*
* var other = {
* 'fruits': ['banana'],
* 'vegetables': ['carrot']
* };
*
* _.merge(object, other, customizer);
* // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
*/
mergeWith<TObject, TSource>(
object: TObject,
source: TSource,
customizer: MergeWithCustomizer
): TObject & TSource;
/**
* @see _.mergeWith
*/
mergeWith<TObject, TSource1, TSource2>(
object: TObject,
source1: TSource1,
source2: TSource2,
customizer: MergeWithCustomizer
): TObject & TSource1 & TSource2;
/**
* @see _.mergeWith
*/
mergeWith<TObject, TSource1, TSource2, TSource3>(
object: TObject,
source1: TSource1,
source2: TSource2,
source3: TSource3,
customizer: MergeWithCustomizer
): TObject & TSource1 & TSource2 & TSource3;
/**
* @see _.mergeWith
*/
mergeWith<TObject, TSource1, TSource2, TSource3, TSource4>(
object: TObject,
source1: TSource1,
source2: TSource2,
source3: TSource3,
source4: TSource4,
customizer: MergeWithCustomizer
): TObject & TSource1 & TSource2 & TSource3 & TSource4;
/**
* @see _.mergeWith
*/
mergeWith<TResult>(
object: any,
...otherArgs: any[]
): TResult;
}
interface LoDashImplicitObjectWrapper<T> {
/**
* @see _.mergeWith
*/
mergeWith<TSource>(
source: TSource,
customizer: MergeWithCustomizer
): LoDashImplicitObjectWrapper<T & TSource>;
/**
* @see _.mergeWith
*/
mergeWith<TSource1, TSource2>(
source1: TSource1,
source2: TSource2,
customizer: MergeWithCustomizer
): LoDashImplicitObjectWrapper<T & TSource1 & TSource2>;
/**
* @see _.mergeWith
*/
mergeWith<TSource1, TSource2, TSource3>(
source1: TSource1,
source2: TSource2,
source3: TSource3,
customizer: MergeWithCustomizer
): LoDashImplicitObjectWrapper<T & TSource1 & TSource2 & TSource3>;
/**
* @see _.mergeWith
*/
mergeWith<TSource1, TSource2, TSource3, TSource4>(
source1: TSource1,
source2: TSource2,
source3: TSource3,
source4: TSource4,
customizer: MergeWithCustomizer
): LoDashImplicitObjectWrapper<T & TSource1 & TSource2 & TSource3 & TSource4>;
/**
* @see _.mergeWith
*/
mergeWith<TResult>(
...otherArgs: any[]
): LoDashImplicitObjectWrapper<TResult>;
}
//_.omit
interface LoDashStatic {
/**