如何使用相同的键合并嵌套对象

时间:2018-01-24 17:04:45

标签: javascript object

我很难使用Object.assign()将嵌套对象与可能相同的键合并;

以代码为例

// Initial structure
let state = {
    pageIndex: 1,
    allResults: {
        queries: {}
    }
}

代码

const assign = (query, page) => {
    const obj = {
        [page]: {
            res: 'hi'
        }
    }

    state.allResults.queries = Object.assign(
        {},
        state.allResults.queries,
        state.allResults.queries[query] || {[query]: {}},
        obj
    )
}

assign('hi', state.pageIndex);
assign('hi', (state.pageIndex + 1));
assign('hello', (state.pageIndex + 1));

console.log(state)

我得到了什么

state = {
    pageindex: 1,
    allResults: {
        queries: {
            1: {
                res: 'hi'
            },
            2: {
                res: 'hi'
            },
            hello: {},
            hi: {}
        }
    }
}

我的期望

let state = {
    pageIndex: 1,
    allResults: {
        queries: {
            hi: {
                1: {
                    res: 'h'
                },
                2: {
                    res: 'h'
                }
            },
            hello: {
                2: {
                    res: 'h'
                }
            }
        }
    }
}

所以,我这样做的方式并没有真正起作用,我无法弄清楚如何获得预期的结果。

提前致谢

3 个答案:

答案 0 :(得分:2)

这会将您发送到queries函数(assignhi)的hello密钥的所需子密钥分配给其先前的值,并与新价值。

state.allResults.queries[query] = Object.assign(
    {},
    state.allResults.queries[query] || {},
    obj
)

答案 1 :(得分:1)

您可以使用嵌套的Object.assign



const assign = (query, page) => {
    const obj = { [page]: { res: 'hi' } }
    state.allResults.queries = Object.assign(
        {},
        state.allResults.queries,
        { [query]: Object.assign(state.allResults.queries[query] || {}, obj) }
    );
}

let state = { pageIndex: 1, allResults: { queries: {} } };

assign('hi', state.pageIndex);
assign('hi', (state.pageIndex + 1));
assign('hello', (state.pageIndex + 1));

console.log(state)

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 2 :(得分:1)

我认为这对您有用:

const assign = (query, page) => {
    const obj = {
        [page]: {
            res: 'hi'
        }
    }

    let _obj = Object.assign(
        {},
        state.allResults.queries[query] || {},
        obj
    );

    state.allResults.queries = Object.assign(
        {},
        state.allResults.queries,
        { [query]: _obj }
    )
}

首先,我创建了将分配给subQuery对象的普通对象。然后我将它合并到一个现有的(如果不是,{}一个空的)对象中。

之后我将其合并到查询对象中。

希望它对你有所帮助。