2017-07-08 64 views
2

我有这个数组,我想合并它内的对象。合并阵列中的对象并保持相同属性的最高值

[null, null, {"1":1},{"2":1},{"3":1},{"2":2},{"5":1}] 

我想过用这样的事情:

var o1 = { a: 1, b: 1, c: 1 }; 
 
var o2 = { b: 2, c: 2 }; 
 
var o3 = { c: 3 }; 
 

 
var obj = Object.assign({}, o1, o2, o3); 
 
console.log(obj); // { a: 1, b: 2, c: 3 }

然而,属性是由具有相同的属性在参数后下令

其他对象覆盖

我想要的是保持最高值可用于相同的属性。

在我的例子,我有{"2":1}{"2":2},我想保持{"2":2}因为2可用于"2"属性的最高值。

我想结束于这个对象:{"1":1,"2":2,"3":1,"5":1}

回答

1

使用Array#reduce到阵列转换为对象,并且使用迭代Array#forEach每个对象的键在数组中。

注意:为了更好地演示解决方案,我已经更新了测试用例在较低值之前具有较高的值。

const arr = [null, null, {"1":0},{"2":3},{"5": 25},{"3":1},{"2":2},{"5":1},{"1":-5}]; 
 

 
const result = arr.reduce((r, o) => { 
 
    if(!typeof(o) === 'object' || o === null) { 
 
    return r; 
 
    } 
 
    
 
    Object.keys(o) // iterate the keys 
 
    .forEach((key) => r[key] = r[key] !== undefined ? Math.max(r[key], o[key]) : o[key]); // get the greatest value 
 
    
 
    return r; 
 
}, {}); 
 

 
console.log(result);

1

您可以使用Lodash库中的_.mergeWith来实现。

var input = [null, null, {"1":1},{"2":1},{"3":1},{"2":2},{"5":1}]; 
var output = _.mergeWith({}, ...input, (obj, src) => obj > src ? obj : src); 
1

香草的javascript:

function getData(obj) { 
 
    var d = {}; 
 
    for (var index in obj) { 
 
     var item = obj[index]; 
 
     for (var k in item) { 
 
      if (!d[k]) d[k] = item[k]; 
 
      else d[k] = Math.max(d[k], item[k]); 
 
     } 
 
    } 
 
    console.log(d); 
 
    return d; 
 
} 
 
getData([null, null, { "1": 1 }, { "2": 1 }, { "3": 1 }, { "2": 2 }, { "5": 1 }]);

1

库增加供应商的规模,所以不喜欢它这么小的目的。

let input = [null, null, {"1":1},{"2":1},{"3":1},{"2":2},{"5":1}]; 
 
let output = {}; 
 

 
for(i in input) { 
 
    let item = input[i]; 
 
    for(j in item) 
 
    output[j] = item[j]; 
 
} 
 

 
console.log(output);

+0

你确定它总是保持最高值每一个属性? – Emilio