Javascript 对象的反应、排序和排列(减少和映射?)
问题如下:() 我有一个对象数组(称为模块),看起来像:Javascript 对象的反应、排序和排列(减少和映射?),javascript,arrays,reactjs,mapreduce,javascript-objects,Javascript,Arrays,Reactjs,Mapreduce,Javascript Objects,问题如下:() 我有一个对象数组(称为模块),看起来像: const modules = [ { thematicArea: "Topic 1", id: 1, name: "Budowanie postawy asertywnej", details: [ "Czym jest asertywność?", "Asertywny Asertywny menedżer – charakterystyczne zachowania"
const modules = [
{
thematicArea: "Topic 1",
id: 1,
name: "Budowanie postawy asertywnej",
details: [
"Czym jest asertywność?",
"Asertywny Asertywny menedżer – charakterystyczne zachowania"
]
},
{
thematicArea: "Topic 2",
id: 2,
name: "Asertywne narzędzia",
details: [
"Asertywna odmowa – zastosowanie trzyetapowej procedury",
"Technika „Zdartej płyty”",
"Wyrażanie pochwał i próśb" ]
},
{
thematicArea: "Topic 3",
id: 3,
name: "Lorem ipsum 1",
details: ["Coś się wymyśli", "Żeby nie było tak łyso"]
},
{
thematicArea: "Topic 3",
id: 4,
name: "Lorem ipsum 2",
details: [
"Wyczesane szkolenia",
"Naprawdępowinieneś wrzucić to do koszyka",
"Na co czekasz - dodaj!"
]
},
{
thematicArea: "Topic 3",
id: 5,
name: "Ipsum Lorem",
details: ["Och", "Ach"]
},
{
thematicArea: "Topic 3",
id: 6,
name: "Ipsum Lorem 1",
details: ["Och", "Ach"]
},
{
thematicArea: "Topic 3",
id: 7,
name: "Ipsum Lorem 2",
details: ["Och", "Ach"]
},
这个数组从App.js传递到thmaticArea.jsx组件。问题是,我改变了显示数据的想法,希望按主题区域对数据进行分组,所以看起来像:
Topic 1:
- Name 1
- Name 2
- Name 6
- ...
Topic 2:
- Name 3
- Name 5
Topic 3:
- Name 4
and so on.
每个名称都是唯一的,只能有一个主题区域(主题),但一个主题区域(主题)可以有多个名称(名称1、名称2…)
我认为我应该先使用reduce()方法,然后使用.map(),但我已经尝试了多种方法,但都不管用。Reduce()方法正在创建没有长度的数组。。。这就是我尝试在App.js中使用reduce实现它并将其作为“模块”传递给thematicArea.jsx组件的方式:
modules={this.state.modules.reduce(function(groups, item) {
const val = item["thematicArea"];
groups[val] = groups[val] || [];
groups[val].push(item);
return groups;
}, [])}
实现预期结果的最佳方法是什么?我有一个例子,结尾是一个对象或数组 这是你想要的吗
const模块=[{
主题领域:“主题1”,
id:1,
名称:“Budowanie postawy asertywnej”,
详情:[
“Czym是在开阿塞蒂瓦诺奇的玩笑吗?”,
“Asertywny Asertywny menedżer–性格风格扎乔瓦尼亚”
]
},
{
主题领域:“主题2”,
id:2,
名称:“Asertywne narzędzia”,
详情:[
“Asertywna odmowa–zastosowanie trzyetapowej程序”,
“Technika”Zdartej płyty“,
“怀拉阿尼·波切瓦·普罗布”
]
},
{
主题领域:“主题3”,
id:3,
名称:“Lorem ipsum 1”,
详情:[“Cośsięwymyśli”,“Żeby nie było takłyso”]
},
{
主题领域:“主题3”,
id:4,
名称:“Lorem ipsum 2”,
详情:[
“Wyczesane szkolenia”,
“Naprawdępowinieneśwrzucićto do koszyka”,
“纳科·泽卡斯-多达杰!”
]
},
{
主题领域:“主题3”,
id:5,
名称:“Ipsum Lorem”,
详情:[“Och”、“Ach”]
},
{
主题领域:“主题3”,
id:6,
名称:“益智1号”,
详情:[“Och”、“Ach”]
},
{
主题领域:“主题3”,
id:7,
名称:“Ipsum Lorem 2”,
详情:[“Och”、“Ach”]
},
];
//如果需要对象中的值
const retObject=modules.reduce((tmp,x)=>{
如果(!tmp[x.Thematic Area]){
tmp[x.thematicArea]=[x.name];
}否则{
tmp[x.thematicArea].push(x.name);
}
返回tmp;
}, {});
log('Value as object-----');
console.log(retObject);
//如果需要数组中的值
const retArray=Object.values(retObject);
log('Value as array-----');
控制台日志(重新排列)代码>如果这不是一个理论编程问题,我认为最好的方法是使用lodash或类似公司的u.groupBy。有时不需要重新设计方向盘。您可以用这种方式使用,最终输出应该是object
notarray
。
const模块=[{
主题领域:“主题1”,
id:1,
名称:“Budowanie postawy asertywnej”,
详情:[
“Czym是在开阿塞蒂瓦诺奇的玩笑吗?”,
“Asertywny Asertywny menedżer–性格风格扎乔瓦尼亚”
]
},
{
主题领域:“主题2”,
id:2,
名称:“Asertywne narzędzia”,
详情:[
“Asertywna odmowa–zastosowanie trzyetapowej程序”,
“Technika”Zdartej płyty“,
“怀拉阿尼·波切瓦·普罗布”
]
},
{
主题领域:“主题3”,
id:3,
名称:“Lorem ipsum 1”,
详情:[“Cośsięwymyśli”,“Żeby nie było takłyso”]
},
{
主题领域:“主题3”,
id:4,
名称:“Lorem ipsum 2”,
详情:[
“Wyczesane szkolenia”,
“Naprawdępowinieneśwrzucićto do koszyka”,
“纳科·泽卡斯-多达杰!”
]
},
{
主题领域:“主题3”,
id:5,
名称:“Ipsum Lorem”,
详情:[“Och”、“Ach”]
},
{
主题领域:“主题3”,
id:6,
名称:“益智1号”,
详情:[“Och”、“Ach”]
},
{
主题领域:“主题3”,
id:7,
名称:“Ipsum Lorem 2”,
详情:[“Och”、“Ach”]
}
];
让结果=模块。减少((obj,val)=>{
obj[val.thematicArea]=obj[val.thematicArea]| |[];
if(obj[val.thematicArea].indexOf(val.name)=-1)
对象[val.thematicArea].push(val.name);
返回obj;
}, {});
控制台日志(结果)代码>但是我需要映射这个对象。我不能使用Object.keys,因为它会丢失连接到每个元素的所有其他数据(结果只有主题1、主题2、主题3没有任何数据连接)。好吧,我承认这是可笑的最简单的排序方式!我不知道为什么我没有想到洛达斯!谢谢你,但是。。。仍然有一个我想要映射()的对象,所以我应该首先使用object.keys,但结果只与thematicArea的名称相似,没有任何进一步的数据连接到每个对象。我该如何处理这个问题呢?看看lodash文档,很容易找到以舒适的方式进行复杂操作的方法。您可以简单地迭代对象键,并使用u.pick()保留想要保留的内容