如何合并对象中的数组

现在有这样的数据:

var data = {
    'stateA': {
        a: [0,300],
        b: [0,200],
        c: [0,500],
        d: [0,320],
        e: [0,800],
        f: [0,150]
    },
    'stateB': {
        a: [0,0],
        b: [50,0],
        c: [200,0],
        d: [0,0],
        e: [0,0],
        f: [350,0]
    },
    //stateC...D...E...N-1
}

其中stateAstateB中的键值是完全相同的,都有a-f,且数组的长度是相同的,目前长度是2,每多一个state,长度会增加1。现在想合并两个state为

{
    a: [0,300],
    b: [50,200],
    c: [200,500],
    d: [0,320],
    e: [0,800],
    f: [350,150]
}

stateA[a]第一个元素和stateB[a]的第一个元素对比,如果都为0,则该位置为0,
如果有一个不为0,则取值不为0的那个
比如
[0,300]
[0,0]
得到[0,300]
不会出现
[0,300]
[0,200]
相同位置都不为0的情况,至少有一个会是0,
请问这样的数据怎么处理比较快捷呢?搞了几个for循环头都大了

阅读 2.1k
2 个回答
function test(data){
  let stateA = data.stateA;
 let stateB = data.stateB;
 let keys = Object.keys(stateA);
 let a = Object.values(stateA).reduce((previousValue, currentValue) => previousValue.concat(currentValue));
 let b = Object.values(stateB).reduce((previousValue, currentValue) => previousValue.concat(currentValue));
 let stateNew = {};
 a.forEach((item, index)=> {
    let keyIndex = parseInt(index / 2);
 let data = stateNew[keys[keyIndex]];
 let value = item > b[index] ? item : b[index];
 stateNew[keys[keyIndex]] = data ? data.concat(value) : [value];
 });
 return stateNew;
}

试试是不是你要的

var data = {
    'stateA': {
        a: [0, 300],
        b: [0, 200],
        c: [0, 500],
        d: [0, 320],
        e: [0, 800],
        f: [0, 150]
    },
    'stateB': {
        a: [0, 0],
        b: [50, 0],
        c: [200, 0],
        d: [0, 0],
        e: [0, 0],
        f: [350, 0]
    }
}
let kw = ['a', 'b', 'c', 'd', 'e', 'f']

let arrs = [], result = [];
const [stateA, stateB] = [Object.values(data['stateA']), Object.values(data['stateB'])]
arrs = stateA.concat(stateB)
let avg = Math.floor(arrs.length / 2)
let i = 0, j = avg;
while (i < avg) {
    const [a, b, x, y] = arrs[i].concat(arrs[j])
    result.push([a || x, b || y])
    i++;
    j++;
}
let res = {}
result.forEach((item, key) => {
    res[kw[key]] = item
})
console.log(res)

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题