如何解决如果数组中的对象具有相同的值,则将它们合并到一个对象中
我有这个对象数组。每个对象都有唯一的值标签。我想通过标签值对它们进行比较,如果该值与一个具有唯一值的新对象匹配,则应创建该值。
var test = [{
isnewLanguage: "false",label: "label1",languages: [{
language: "English",questions: [{
choices: "choices1",fields: "false",mainText: "MAinText1",subText: "SubText1"
}]
}],numberOfChoices: "5"
},{
isnewLanguage: "false",label: "label2",questions: [{
choices: "choices2",mainText: "MAinText2",subText: "SubText2"
}]
}],{
isnewLanguage: "true",languages: [{
language: "Italian",questions: [{
choices: "choicesItalian1",mainText: "MainTextItalian1",subText: "SubTextItalian1"
}]
}],numberOfChoices: "false"
},questions: [{
choices: "choicesItalian2",mainText: "MAinTextItalian2",subText: "SubTextItalian2"
}]
}],languages: [{
language: "Chinece",questions: [{
choices: "choicesChinece",mainText: "MainTextChinece1",subText: "SubTextChinece1"
}]
}],numberOfChoices: "false"
}]
下面是必需的结构。具有相同标签值的每个对象都应使用新语言附加到一个对象上。
var theRequiredStructure = [{
isnewLanguage: "true",languagesTest: [{
language: "English",questions: [{
choices: "choices1",subText: "SubText1"
}]
},{
language: "Italian",questions: [{
choices: "choicesItalian1",subText: "SubTextItalian1"
}]
},{
language: "Chinece",questions: [{
choices: "choicesChinece",subText: "SubTextChinece1"
}]
}],numberOfChoices: "false"
},{
isnewLanguage: "true",questions: [{
choices: "choices2",subText: "SubText2"
}]
},questions: [{
choices: "choicesItalian2",mainText: "MainTextItalian2",subText: "SubTextItalian2"
}]
},questions: [{
choices: "choicesChinece2",mainText: "MainTextChinece2",subText: "SubTextChinece2"
}]
}],numberOfChoices: "false"
}
这是我的工作,但显然它仅适用于第一个元素。如何获得所有元素所需的结构?我主要喜欢我可以理解的ES5解决方案。感谢您抽出宝贵的时间
var test = [{
isnewLanguage: "false",languages: [{
language: "English",subText: "SubText1"
}]
}],numberOfChoices: "5"
},{
isnewLanguage: "false",questions: [{
choices: "choices2",subText: "SubText2"
}]
}],languages: [{
language: "Italian",subText: "SubTextItalian1"
}]
}],subText: "SubTextItalian2"
}]
}],languages: [{
language: "Chinece",numberOfChoices: "false"
}]
var theLanguagesTest = [];
var obj = {};
for (var i = 0; i < test.length; i++) {
if (test[0].label == test[i].label) {
obj = test[i]
}
for (var j = 0; j < test[i].languages.length; j++) {
if (test[0].label == test[i].label) {
theLanguagesTest.push(test[i].languages[j])
obj.languagesTest = theLanguagesTest
}
}
delete test[i].languages;
delete test[i].questions;
}
console.log(obj)
解决方法
您的意思是这样的吗?这只是草稿代码,只是向您展示逻辑(一种可能的方式)。阅读下面的代码中的注释
var test = [{
isnewLanguage: "false",label: "label1",languages: [{
language: "English",questions: [{
choices: "choices1",fields: "false",mainText: "MAinText1",subText: "SubText1"
}]
}],numberOfChoices: "5"
},{
isnewLanguage: "false",label: "label2",questions: [{
choices: "choices2",mainText: "MAinText2",subText: "SubText2"
}]
}],{
isnewLanguage: "true",languages: [{
language: "Italian",questions: [{
choices: "choicesItalian1",mainText: "MainTextItalian1",subText: "SubTextItalian1"
}]
}],numberOfChoices: "false"
},questions: [{
choices: "choicesItalian2",mainText: "MAinTextItalian2",subText: "SubTextItalian2"
}]
}],languages: [{
language: "Chinece",questions: [{
choices: "choicesChinece",mainText: "MainTextChinece1",subText: "SubTextChinece1"
}]
}],numberOfChoices: "false"
}];
// New array
const result = [];
// Map object to map key -> result array index
const map = {};
// Simple loop
for(let i = 0; i < test.length; i++) {
// If map contains key with current label
// then we have it in result array
if(map[test[i].label] && result[map[test[i].label]] === 0 || result[map[test[i].label]]) {
// Push same label languages content to results array languageTests subarray
result[map[test[i].label]].languageTests.push(test[i].languages[0]);
} else {
// Else create map record
map[test[i].label] = Object.keys(map).length;
// Copy and modify current object
const item = test[i];
// Create languageTests sub array
item.languageTests = [];
// Copy languages object there
item.languageTests.push(item.languages[0]);
// delete languages
delete item.languages;
// Push re-formed item to results
result.push(item);
}
}
// Log
console.log(result);
,
您也可以这样做:
var test = [{
isnewLanguage: "false",languages: [{
language: "English",questions: [{
choices: "choices1",subText: "SubText1"
}]
}],{
isnewLanguage: "false",questions: [{
choices: "choices2",subText: "SubText2"
}]
}],{
isnewLanguage: "true",languages: [{
language: "Italian",questions: [{
choices: "choicesItalian1",subText: "SubTextItalian1"
}]
}],questions: [{
choices: "choicesItalian2",subText: "SubTextItalian2"
}]
}],languages: [{
language: "Chinece",questions: [{
choices: "choicesChinece",subText: "SubTextChinece1"
}]
}],numberOfChoices: "false"
}]
var byUniqueLabels = {};
var labelsArray = [];
for (var i = 0; i < test.length; i++) {
if (byUniqueLabels[test[i].label] == "" || byUniqueLabels[test[i].label] == undefined) {
byUniqueLabels[test[i].label] = { 'isnewLanguage': test[i].isnewLanguage,'label': test[i].label,languagesTest: [] };
}
for (var j = 0; j < test[i].languages.length; j++) {
byUniqueLabels[test[i].label].languagesTest.push(test[i].languages[j]);
}
}
for (label in byUniqueLabels) {
labelsArray.push(byUniqueLabels[label]);
}
console.log(labelsArray);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。