从侦听器事件构造Javascript对象



我有一个侦听器事件,它用一个参数"数据";看起来是这样的:

{field_id: 13, meta_value: 'a', rowid: 0}
{field_id: 13, meta_value: 'ab', rowid: 0}
{field_id: 13, meta_value: 'abc', rowid: 0}
{field_id: 14, meta_value: 'd', rowid: 0}
{field_id: 14, meta_value: 'de', rowid: 0}
{field_id: 14, meta_value: 'def', rowid: 0}
{field_id: 13, meta_value: 'b', rowid: 1}
{field_id: 13, meta_value: 'bb', rowid: 1}
{field_id: 13, meta_value: 'bbb', rowid: 1}
{field_id: 14, meta_value: 'c', rowid: 1}
{field_id: 14, meta_value: 'cc', rowid: 1}
{field_id: 14, meta_value: 'ccc', rowid: 1}

我想把它变成一个像一样的物体

{
0: {
{
field_id: 13,
meta_value: abc
},
{
field_id: 14,
meta_value: def
}
},

1: {
{
field_id: 13,
meta_value: bbb
},
{
field_id: 14,
meta_value: ccc
}
}
}

我试过了:

outputValue[rowid][field_id] = data;

不幸的是,这种方法创建了一个包含大量空索引的数组。优选地,我想构建一个对象,其中键是rowid,并且如果可以像上面一样匹配现有的field_id,则创建或覆盖{field_id、meta_value}。

所描述的对象

{
0: {
{
field_id: 13,
meta_value: abc
},
{
field_id: 14,
meta_value: def
}
},

1: {
{
field_id: 13,
meta_value: bbb
},
{
field_id: 14,
meta_value: ccc
}
}
}

无效。

我想你想要一个更像这样的物体:

{
0: {
13: {
meta_value: "abc"
},
14: {
meta_value: "def"
}
},
1: {
13: {
meta_value: "bbb"
},
14: {
meta_value: "ccc"
}
}
}

虽然meta_value的合并还不清楚,但我想,您希望存储最后一个。

为您构建一个函数是相对容易的:

const events = [{
field_id: 13,
meta_value: 'a',
rowid: 0
}, {
field_id: 13,
meta_value: 'ab',
rowid: 0
}, {
field_id: 13,
meta_value: 'abc',
rowid: 0
}, {
field_id: 14,
meta_value: 'd',
rowid: 0
}, {
field_id: 14,
meta_value: 'de',
rowid: 0
}, {
field_id: 14,
meta_value: 'def',
rowid: 0
}, {
field_id: 13,
meta_value: 'b',
rowid: 1
}, {
field_id: 13,
meta_value: 'bb',
rowid: 1
}, {
field_id: 13,
meta_value: 'bbb',
rowid: 1
}, {
field_id: 14,
meta_value: 'c',
rowid: 1
}, {
field_id: 14,
meta_value: 'cc',
rowid: 1
}, {
field_id: 14,
meta_value: 'ccc',
rowid: 1
}]

const state = () => {
const _res = {}
const setVal = (obj) => ({ field_id, meta_value, rowid }) => {
if (typeof obj[rowid] === "undefined") obj[rowid] = {}
obj[rowid][field_id] = { field_id, meta_value }
return obj
}
const addToRes = setVal(_res)
return {
res,
addToRes,
}
}
const { res, addToRes } = state()

events.forEach(addToRes)
console.log(res)