2017-01-15 2 views
0

Так Instance У меня есть следующие функции:Передача аргумента функции, которая преобразует объект присваивания

function merge(arr, key) { 
return arr.reduce((r, o) => { 
    if (r[o.key]) { 
     r[o.key].real += o.real; 
    } else { 
     r[o.key] = { key: o.key, real: o.real }; 
    } 
    return r; 
    }, {}); 
} 

И я хочу использовать его в 10 раз, но каждый раз, когда { key: o.key, real: o.real } будет отличаться, например, { key: o.key, valueX: o.valueX } и т.д. Как я могу сгенерировать этот объект как параметр функции? так Если бы я работать

merge(arr, key, ['key, real']) // object assign will happen to key and real 

Я немного запутался там

Случай 1:

var arrayOne = [{ someKey: '22', value: 345 }, { someKey: '22', value: 543 }] 
 

 
function merge(arr, key) { 
 
    return arr.reduce((r, o) => { 
 
     if (r[o.key]) { 
 
      r[o.key].value += o.value; 
 
     } else { 
 
      r[o.key] = { key: o.someKey, value: o.value }; 
 
     } 
 
     return r; 
 
     }, {}); 
 
    } 
 

 
console.log(merge(arrayOne, 'someKey'))

Случай 2:

var arrayTwo = [{ someKeyY: '22', valueZ: 345 }, { someKeyY: '22', valueZ: 543 }] 
 

 
    function merge(arr, key) { 
 
     return arr.reduce((r, o) => { 
 
      if (r[o.key]) { 
 
       r[o.key].valueZ += o.valueZ; 
 
      } else { 
 
       r[o.key] = { key: o.someKeyY, valueZ: o.valueZ }; 
 
      } 
 
      return r; 
 
      }, {}); 
 
     } 
 

 
    console.log(merge(arrayTwo, 'someKeyY'))

Я хочу универсальную функцию вместо того, чтобы писать ту же функцию, снова и снова и изменяя только объект назначения ...

+1

пожалуйста, добавьте вход и ожидаемый результат, а также. –

+0

Непонятно, что вы просите; отвечая на вопрос @ NinaScholz выше, поможет честно, но если вы сможете объяснить более четко, это тоже будет хорошо. Я подозреваю, что [ответы на этот вопрос] (http://stackoverflow.com/questions/4244896/dynamically-access-object-property-using-variable) поможет, однако, поскольку 'o.key' всегда обращается к свойству, называемому' ' key ", тогда как' o [key] 'обращается к свойству, названному значением переменной' key'. –

+0

Я отредактировал сообщение @NinaScholz –

ответ

0

Из того, что я понимаю, вы хотите передать следующие аргументы

function (arrayToMerge, mergeKey, sumKey, objKeyVal) 

Вы можете использовать чистые алгоритмы JavaScript и сделать что-то вроде этого:

var arr = [{ categoryID: 'A', timestamp: '1', name: 'Name', real: 10 }, { categoryID: 'B', timestamp: '1', name: 'Name', real: 10 }, { categoryID: 'B', timestamp: '1', name: 'Name', real: 10 }] 
 

 
function mergeCats(categories) { 
 
    return categories.reduce((r, o) => { 
 
    if (r[o.categoryID]) { 
 
     r[o.categoryID].real += o.real; 
 
    } else { 
 
     r[o.categoryID] = { timestamp: o.timestamp, real: o.real, categoryID: o.categoryID, name: o.name }; 
 
    } 
 
    return r; 
 
    }, {}); 
 
} 
 

 
console.log('merge', mergeCats(arr)) 
 

 
function masterMerger(a, b, c, d) { 
 
    return a.reduce((r, o) => { 
 
    if (r[o[b]]) { 
 
     r[o[b]][c] += o[c]; 
 
    } else { 
 
     const obj = {}; 
 
     for (let i = 0; i < d.length; i += 1) { 
 
     obj[d[i]] = o[d[i]] 
 
     } 
 
     r[o[b]] = obj; 
 
    } 
 
    return r; 
 
    }, {}) 
 
} 
 

 
console.log('merge 2', masterMerger(arr, 'categoryID', 'real', ['timestamp', 'real', 'categoryID', 'name']))

затем просто использовать masterMerger

masterMerget(arrayToMerge, mergeKey, sumKey, objKeyVal) 
0

Объединить все:

var arrayTwo = [{ someKeyY: '22', valueZ: 345 }, { someKeyY: '22', valueZ: 543 }] 

function merge(arr) { 
    return arr.reduce((obj, newobj) => { 
     for(key in newobj){ 
      obj[key]=obj[key]||0; 
      obj[key]+=newobj[key]; 
     } 
     return obj; 
    },{}); 
    } 

console.log(merge(arrayTwo)) 

Объединить только некоторые значения:

function merge(arr,keys) { 
    return arr.reduce((obj, newobj) => { 
     for(key in keys){ 
      obj[key]=obj[key]||0; 
      if(newobj[key]){//prevent crashing 
      obj[key]+=newobj[key]; 
      } 
     } 
     return obj; 
    },{}); 
    } 

console.log(merge(arrayTwo,["someKeyY","valueZ"])) 
0

Вы можете передать value также как параметр для общего функционала n, и он может вернуть фактический объединенный массив вместо карты.

function merge(arr, key, value) { 
 
    var result = arr.reduce((r, o) => { 
 
     if (r[o[key]]) { //key = someKey, o[key] = 22 
 
      r[o[key]][value] += o[value]; 
 
     } else { 
 
      r[o[key]] = o; 
 
     } 
 
     return r; 
 
    }, {}); 
 
    return Object.values(result); 
 
} 
 

 
var arrayOne = [{ someKey: '22', value: 345 }, { someKey: '22', value: 543 }, { someKey: '23', value: 666 }]; 
 

 
console.log(merge(arrayOne, 'someKey', 'value')); 
 

 
var arrayTwo = [{ someKeyY: '22', valueZ: 345 }, { someKeyY: '22', valueZ: 543 }, { someKeyY: '23', valueZ: 666 }]; 
 

 
console.log(merge(arrayTwo, 'someKeyY', 'valueZ'));