Javascript 以相同名称连接json条目
我目前正在尝试学习javascript的基础知识并使用JSON 我有一个JSON文件,其中我想将相同名称的导入合并到一个条目中。那怎么可能呢 原始JSONJavascript 以相同名称连接json条目,javascript,java,arrays,json,Javascript,Java,Arrays,Json,我目前正在尝试学习javascript的基础知识并使用JSON 我有一个JSON文件,其中我想将相同名称的导入合并到一个条目中。那怎么可能呢 原始JSON [{ "name": "1.date.17-Nov-18", "size": 1000, "imports": ["1.location.HOUSTON", "1.person.JOHN"] }, {
[{
"name": "1.date.17-Nov-18",
"size": 1000,
"imports": ["1.location.HOUSTON", "1.person.JOHN"]
},
{
"name": "1.date.17-Nov-18",
"size": 1000,
"imports": ["1.location.MIAMI", "1.person.BEN", "1.person.JOHN"]
},
{
"name": "1.date.18-Nov-18",
"size": 1000,
"imports": ["1.location.UBER", "1.person.JOHN"]
}
]
预期产出
[{
"name": "1.date.17-Nov-18",
"size": 1000,
"imports": ["1.location.HOUSTON", "1.person.JOHN", "1.location.MIAMI", "1.person.BEN"]
},
{
"name": "1.date.18-Nov-18",
"size": 1000,
"imports": ["1.location.UBER", "1.person.JOHN"]
}
]
如有任何提示和建议,将不胜感激。非常感谢。使用对象跟踪名称,我们使用
forEach
遍历数据数组
然后,我们检查项
的名称
之前是否已传递。如果它已通过,我们将它们的导入
合并在一起。如果没有,我们将该项添加到对象中
为了防止重复的导入
,我们使用防止重复的元素,然后使用spread…
操作符将其转换回数组
然后我们使用Object.values
返回合并数据,而不使用名称作为键
constresult={};
const data=[{“name”:“1.date.17-11-18”,“size”:1000,“imports”:[“1.location.HOUSTON”,“1.person.JOHN”],{“name”:“1.date.17-11-18”,“size”:1000,“imports”:[“1.location.MIAMI”,“1.person.BEN”,“1.person.JOHN”],{“name”:“1.date.18-11-18”,“size”:1000,“imports”:“1.location.location.UBER.UBER”,“1.person.JOHN”];
data.forEach(项=>{
如果(结果中的item.name)结果[item.name].imports=[…新集合([…item.imports,…结果[item.name].imports]);
else结果[项目名称]=项目;
});
console.log(Object.values(result))代码>您可以这样尝试
const data=[{“name”:“1.date.17-Nov-18”,“size”:1000,“imports”:[“1.location.HOUSTON”,“1.person.JOHN”],{“name”:“1.date.17-Nov-18”,“size”:1000,“imports”:[“1.location.MIAMI”,“1.person.BEN”,“1.person.JOHN”],{“name”:“1.date.11-18”,“size”:1000,“imports”:[“1.location.location.UBER.UBER”,“1.person.JOHN”];
const result=data.reduce((acc,{name,size,imports})=>{
acc[name]=acc[name]|{name:name,size:size,imports:[]};
acc[name].imports=[…新集合([…acc[name].imports,…imports]);
返回acc;
}, {})
console.log(Object.values(result))代码>
.as控制台包装{min height:100%!important;top:0}
您可以使用数组.prototype.reduce解决此问题。当你开始学习JS时,我会更仔细地写下答案。试试这个-
const数据=[{
“名称”:“1.日期18年11月17日”,
“尺寸”:1000,
“进口”:[“1.地点.休斯顿”,“1.个人.约翰”]
},
{
“名称”:“1.日期18年11月17日”,
“尺寸”:1000,
“进口”:[“1.地点.迈阿密”,“1.个人.本”,“1.个人.约翰”]
},
{
“名称”:“1.日期:2018年11月18日”,
“尺寸”:1000,
“导入”:[“1.location.UBER”,“1.person.JOHN”]
}];
让res=数据。减少((acc,curr)=>{
if(会计科目[当前名称]==未定义){
//如果不存在,则取原始的当前对象
会计科目[当前名称]=当前;
}否则{
//如果存在,则将当前导入推送到以前的导入
acc[curr.name].imports.push(…curr.imports);
}
返回acc;
}, {});
//将对象转换为数组。
res=对象值(res);
控制台日志(res)代码>
.as控制台包装{最小高度:100%!重要;顶部:0}
将数组缩小为映射
,然后使导入唯一
const数据=[
{
名称:“1.日期:2018年11月17日”,
尺寸:1000,
导入:['1.location.HOUSTON','1.person.JOHN'],
},
{
名称:“1.日期:2018年11月17日”,
尺寸:1000,
导入:['1.location.MIAMI','1.person.BEN','1.person.JOHN'],
},
{
名称:“1.日期:2018年11月18日”,
尺寸:1000,
导入:['1.location.UBER','1.person.JOHN'],
},
];
console.log(
Array.from(data.reduce)(m,o)=>(
m、 has(o.name)
?m.get(o.name).imports.push(…o.imports)
:m.set(o.name,{…o}),
m) ,新映射())。值(),
(v) =>({…v,导入:[…新集合(v.imports)]})
);代码>如果导入条目同时出现在不同的键上,则会重复导入条目。有没有办法让它只出现一次?@feverretiate检查编辑器是否按预期工作。非常感谢你!问题是,导入
需要具有唯一的元素。查看OP的预期结果。我已使用更新了我的答案以获取唯一项。请看一看。谢谢@SomShekharMukherjeeYa现在一切正常+1.