从值中更改具有一个属性的对象的键
Change the key of an object with one attribute from its values
具有具有以下结构的对象数组:
[
{
key: id,
value: id, name, type
},
{ key: id,
value: id, name, type
},
{ key: id,
value: id, name, type
}
];
使用的密钥是id。同一 id 可以有更多组值,例如:
{ 132: Array(1), 243: Array(1), 389: Array(3)}
132: Array(1)
0: eqKey: "abc", id: 132, name: "name1"
243: Array(1)
0: eqKey: "ccc", id: 243, name: "name2"
389: Array(3)
0: eqKey: "vcv", id: 389, name: "name3"
1: eqKey: "tre", id: 389, name: "name4"
2: eqKey: "ace", id: 389, name: "name5"
我的问题是这是否是一种 "regroup" 结构的方法,而不是按 id 分组以按类型分组。 (类型是唯一的)
因此,上述示例的最终形式如下所示:
{"abc": Ar(1), "ccc": Ar(1), "vcv": Ar(1), "tre": Ar(1), "ace": Ar(1)}
"abc": Array(1)
0: eqKey: "abc", id: 132, name: "name1"
"ccc": Array(1)
0: eqKey: "ccc", id: 243, name: "name2"
"vcv": Array(1)
0: eqKey: "vcv", id: 389, name: "name3"
"tre": Array(1)
0: eqKey: "tre", id: 389, name: "name4"
"ace": Array(1)
0: eqKey: "ace", id: 389, name: "name5"
正如评论中所指出的,您的第二个代码片段在 JS 中是不可能的。对象必须具有唯一键。
但是,我相信您要实现的目标是:
const array = [
{
1: { id: 1, name: 'name', type: 'ab' }
},
{
5: { id: 5, name: 'name', type: 'aa' },
4: { id: 4, name: 'name', type: 'ac' }
}
];
const result = array
.reduce((arr, item) => Object
.keys(item)
.reduce((arr2, key) => ([...arr2, { [item[key].type]: item[key] }]), arr), []);
console.log(result);
您可以使用reduce
来遍历数组。使用 Object.values
将每个对象转换为数组并使用 forEach
循环遍历转换后的数组
const arr = [{"1":{"id":1,"name":"name1","type":"xx"}},{"2":{"id":2,"name":"name2","type":"xy"}},{"5":{"id":5,"name":"name5","type":"vc"},"6":{"id":5,"name":"name6","type":"fg"},"7":{"id":5,"name":"name7","type":"ae"}}];
const result = arr.reduce((c, v) => {
Object.values(v).forEach(o => c.push({[o.type]: o}))
return c;
}, []);
console.log( result );
在新浏览器(或使用分析器)上,您可以使用 flatMap
const arr = [{"1":{"id":1,"name":"name1","type":"xx"}},{"2":{"id":2,"name":"name2","type":"xy"}},{"5":{"id":5,"name":"name5","type":"vc"},"6":{"id":5,"name":"name6","type":"fg"},"7":{"id":5,"name":"name7","type":"ae"}}];
const result = arr.flatMap(o => Object.values(o).map(v => ({[v.type]: v})))
console.log(result);
您可以使用 reduce
method.
来实现您的要求
The reduce() method executes a reducer function (that you provide) on
each member of the array resulting in a single output value.
const data = [{
id: 1,
name: "name1",
type: "xx"
},{
id: 2,
name: "name2",
type: "xy"
},{
id: 5,
name: "name5",
type: "vc"
},{
id: 5,
name: "name6",
type: "fg"
}, {
id: 5,
name: "name7",
type: "ae"
}
];
const result = data.reduce(function(r, a) {
r[a.type] = r[a.type] || [];
r[a.type].push(a);
return r;
}, Object.create(null));
console.log(result);
您可以对对象的外部值和内部数组使用两个嵌套的 reduce。
var data = { 132: [{ eqKey: "abc", id: 132, name: "name1" }], 243: [{ eqKey: "ccc", id: 243, name: "name2" }], 389: [{ eqKey: "vcv", id: 389, name: "name3" }, { eqKey: "tre", id: 389, name: "name4" }, { eqKey: "ace", id: 389, name: "name5" }] },
grouped = Object
.values(data)
.reduce(
(r, a) => a.reduce(
(s, o) => ((r[o.eqKey] = r[o.eqKey] || []).push(o), s),
r
),
{}
);
console.log(grouped);
具有具有以下结构的对象数组:
[
{
key: id,
value: id, name, type
},
{ key: id,
value: id, name, type
},
{ key: id,
value: id, name, type
}
];
使用的密钥是id。同一 id 可以有更多组值,例如:
{ 132: Array(1), 243: Array(1), 389: Array(3)}
132: Array(1)
0: eqKey: "abc", id: 132, name: "name1"
243: Array(1)
0: eqKey: "ccc", id: 243, name: "name2"
389: Array(3)
0: eqKey: "vcv", id: 389, name: "name3"
1: eqKey: "tre", id: 389, name: "name4"
2: eqKey: "ace", id: 389, name: "name5"
我的问题是这是否是一种 "regroup" 结构的方法,而不是按 id 分组以按类型分组。 (类型是唯一的)
因此,上述示例的最终形式如下所示:
{"abc": Ar(1), "ccc": Ar(1), "vcv": Ar(1), "tre": Ar(1), "ace": Ar(1)}
"abc": Array(1)
0: eqKey: "abc", id: 132, name: "name1"
"ccc": Array(1)
0: eqKey: "ccc", id: 243, name: "name2"
"vcv": Array(1)
0: eqKey: "vcv", id: 389, name: "name3"
"tre": Array(1)
0: eqKey: "tre", id: 389, name: "name4"
"ace": Array(1)
0: eqKey: "ace", id: 389, name: "name5"
正如评论中所指出的,您的第二个代码片段在 JS 中是不可能的。对象必须具有唯一键。
但是,我相信您要实现的目标是:
const array = [
{
1: { id: 1, name: 'name', type: 'ab' }
},
{
5: { id: 5, name: 'name', type: 'aa' },
4: { id: 4, name: 'name', type: 'ac' }
}
];
const result = array
.reduce((arr, item) => Object
.keys(item)
.reduce((arr2, key) => ([...arr2, { [item[key].type]: item[key] }]), arr), []);
console.log(result);
您可以使用reduce
来遍历数组。使用 Object.values
将每个对象转换为数组并使用 forEach
循环遍历转换后的数组
const arr = [{"1":{"id":1,"name":"name1","type":"xx"}},{"2":{"id":2,"name":"name2","type":"xy"}},{"5":{"id":5,"name":"name5","type":"vc"},"6":{"id":5,"name":"name6","type":"fg"},"7":{"id":5,"name":"name7","type":"ae"}}];
const result = arr.reduce((c, v) => {
Object.values(v).forEach(o => c.push({[o.type]: o}))
return c;
}, []);
console.log( result );
在新浏览器(或使用分析器)上,您可以使用 flatMap
const arr = [{"1":{"id":1,"name":"name1","type":"xx"}},{"2":{"id":2,"name":"name2","type":"xy"}},{"5":{"id":5,"name":"name5","type":"vc"},"6":{"id":5,"name":"name6","type":"fg"},"7":{"id":5,"name":"name7","type":"ae"}}];
const result = arr.flatMap(o => Object.values(o).map(v => ({[v.type]: v})))
console.log(result);
您可以使用 reduce
method.
The reduce() method executes a reducer function (that you provide) on each member of the array resulting in a single output value.
const data = [{
id: 1,
name: "name1",
type: "xx"
},{
id: 2,
name: "name2",
type: "xy"
},{
id: 5,
name: "name5",
type: "vc"
},{
id: 5,
name: "name6",
type: "fg"
}, {
id: 5,
name: "name7",
type: "ae"
}
];
const result = data.reduce(function(r, a) {
r[a.type] = r[a.type] || [];
r[a.type].push(a);
return r;
}, Object.create(null));
console.log(result);
您可以对对象的外部值和内部数组使用两个嵌套的 reduce。
var data = { 132: [{ eqKey: "abc", id: 132, name: "name1" }], 243: [{ eqKey: "ccc", id: 243, name: "name2" }], 389: [{ eqKey: "vcv", id: 389, name: "name3" }, { eqKey: "tre", id: 389, name: "name4" }, { eqKey: "ace", id: 389, name: "name5" }] },
grouped = Object
.values(data)
.reduce(
(r, a) => a.reduce(
(s, o) => ((r[o.eqKey] = r[o.eqKey] || []).push(o), s),
r
),
{}
);
console.log(grouped);