我需要将具有相同键的JSON对象合并为一个,以便它获取一个对象或数组(如果结果是对象或数组,则无关紧要),其中包含键和值的数组
示例JSON对象:
[{
"meine_frage": "hier kommt die antwort",
"ne_andere_frage": "ne andere antwort",
"was_willst_du": "alles",
"mehr_zur_auswahl": ["einiges", "vieles und", "g\u00e4r nix"]
}, {
"meine_frage": "tom & jerry",
"ne_andere_frage": "mickey maus",
"was_willst_du": "oder",
"mehr_zur_auswahl": ["manches", "einiges", "vieles und", "g\u00e4r nix"]
}, {
"meine_frage": "dick und doof",
"ne_andere_frage": "minnie muas",
"was_willst_du": "nichts",
"mehr_zur_auswahl": ["g\u00e4r nix"]
}]
结果应如下所示:
[{
"meine_frage": ["hier kommt die antwort", "tom & jerry", "dick und doof"],
"ne_andere_frage": ["ne andere antwort", "mickey maus", "minnie muas"],
"was_willst_du": ["alles", "oder"],
"mehr_zur_auswahl": ["einiges", "vieles und", "g\u00e4r nix", "manches", "einiges", "vieles und", "g\u00e4r nix"]
}]
某些值已经是数组而其他值没有,键是动态进行的,所以假设键名是未知的
我尝试使用$ .each和for循环迭代键/值但是没有成功,也搜索了网络但是找不到类似的, 感谢任何帮助
答案 0 :(得分:9)
您可以使用reduce()
和concat()
方法。
const data = [{"meine_frage":"hier kommt die antwort","ne_andere_frage":"ne andere antwort","was_willst_du":"alles","mehr_zur_auswahl":["einiges","vieles und","gär nix"]},{"meine_frage":"tom & jerry","ne_andere_frage":"mickey maus","was_willst_du":"oder","mehr_zur_auswahl":["manches","einiges","vieles und","gär nix"]},{"meine_frage":"dick und doof","ne_andere_frage":"minnie muas","was_willst_du":"nichts","mehr_zur_auswahl":["gär nix"]}]
const result = data.reduce(function(r, e) {
return Object.keys(e).forEach(function(k) {
if(!r[k]) r[k] = [].concat(e[k])
else r[k] = r[k].concat(e[k])
}), r
}, {})
console.log(result)

答案 1 :(得分:5)
您可以通过传递reduce
函数作为参数来使用callback
方法。
算法如下:如果最终对象已经包含一个键,则应使用空数组初始化键值。否则,您应该追加来自数组中的所有项目的数组值。
let data = [{"meine_frage":"hier kommt die antwort","ne_andere_frage":"ne andere antwort","was_willst_du":"alles","mehr_zur_auswahl":["einiges","vieles und","gär nix"]},{"meine_frage":"tom & jerry","ne_andere_frage":"mickey maus","was_willst_du":"oder","mehr_zur_auswahl":["manches","einiges","vieles und","gär nix"]},{"meine_frage":"dick und doof","ne_andere_frage":"minnie muas","was_willst_du":"nichts","mehr_zur_auswahl":["gär nix"]}]
let result = data.reduce(function(obj, item){
Object.keys(item).forEach(function(key){
if(!obj[key]) obj[key] = [].concat(item[key])
else {
if(Array.isArray(item[key]))
obj[key].push(...item[key])
else
obj[key].push(item[key]);
}
});
return obj;
},{});
console.log([result]);
答案 2 :(得分:3)
此功能将完成工作:
const example = array => {
let newObject = {}
array.forEach((element) => {
for(let key in element) {
if(typeof element[key] === 'object') {
element[key].forEach((el) => {
if(newObject[key] && newObject[key].length) {
newObject[key].push(el)
}
else {
newObject[key] = [el]
}
})
}
else {
if(newObject[key] && newObject[key].length){
newObject[key].push(element[key])
}
else{
newObject[key] = [element[key]]
}
}
}
})
return newObject
}
答案 3 :(得分:2)
使用map
并按Array.isArray
进行检查,请尝试以下代码
var myArray = [{"meine_frage": "hier kommt die antwort","ne_andere_frage": "ne andere antwort","was_willst_du": "alles","mehr_zur_auswahl": ["einiges", "vieles und", "g\u00e4r nix"]}, {"meine_frage": "tom & jerry","ne_andere_frage": "mickey maus","was_willst_du": "oder","mehr_zur_auswahl": ["manches", "einiges", "vieles und", "g\u00e4r nix"]}, {"meine_frage": "dick und doof","ne_andere_frage": "minnie muas","was_willst_du": "nichts","mehr_zur_auswahl": ["g\u00e4r nix"]}];
var findKeyOf = function(key){
var temp = myArray.map(function(e){
return e[key];
});
var test = [];
for(let i in temp){
if(Array.isArray(temp[i]) ){
test = test.concat(temp[i]);
}else{
test.push(temp[i])
}
}
return test;
};
var newArr = [
{meine_frage:findKeyOf('meine_frage')},
{ne_andere_frage:findKeyOf('ne_andere_frage')},
{was_willst_du:findKeyOf('was_willst_du')},
{mehr_zur_auswahl:findKeyOf('mehr_zur_auswahl')},
]
console.log(newArr);

答案 4 :(得分:2)
您可以使用Productivity-
Prod dec 21 - 1
Prod dec 21 - 2
prod dec 21 - 3
作为累加器,遍历对象的每个键并prod dec 21 - 3
值。
array#reduce
array#concat
答案 5 :(得分:2)
var data = [{
"meine_frage": "hier kommt die antwort",
"ne_andere_frage": "ne andere antwort",
"was_willst_du": "alles",
"mehr_zur_auswahl": ["einiges", "vieles und", "g\u00e4r nix"]
}, {
"meine_frage": "tom & jerry",
"ne_andere_frage": "mickey maus",
"was_willst_du": "oder",
"mehr_zur_auswahl": ["manches", "einiges", "vieles und", "g\u00e4r nix"]
}, {
"meine_frage": "dick und doof",
"ne_andere_frage": "minnie muas",
"was_willst_du": "nichts",
"mehr_zur_auswahl": ["g\u00e4r nix"]
}]
let myData = data.reduce((b , a)=> {
Object.keys(a).forEach(key => {
if (Object.keys(b).indexOf(key) > -1) {
if (typeof a[key] === "object") {
b[key] = [...b[key], ...a[key]]
} else {
b[key].push(a[key])
}
} else {
if (typeof a[key] === "object") {
b[key] = [...a[key]]
} else {
b[key] = [a[key]]
}
}
})
return b
}, {})
console.log(myData)
.as-console-wrapper { max-height: 100% !important; top: 0; }