0

I have this array of objects. Every object has a unique value label. I would like to compare them by the label value and if the value matches a new object with the unique value should be created.

  var test = [{
          isnewLanguage: "false",
          label: "label1",
          languages: [{
          language: "English",
          questions: [{
          choices: "choices1",
          fields: "false",
          mainText: "MAinText1",
          subText: "SubText1"
        }]
        }],
          numberOfChoices: "5"
        }, {
          isnewLanguage: "false",
          label: "label2",
          languages: [{
          language: "English",
          questions: [{
          choices: "choices2",
          fields: "false",
          mainText: "MAinText2",
          subText: "SubText2"
        }]
        }],
          numberOfChoices: "5"
        }, {
          isnewLanguage: "true",
          label: "label1",
          languages: [{
          language: "Italian",
          questions: [{
          choices: "choicesItalian1",
          fields: "false",
          mainText: "MainTextItalian1",
          subText: "SubTextItalian1"
        }]
        }],
          numberOfChoices: "false"
        }, {
          isnewLanguage: "true",
          label: "label2",
          languages: [{
          language: "Italian",
          questions: [{
          choices: "choicesItalian2",
          fields: "false",
          mainText: "MAinTextItalian2",
          subText: "SubTextItalian2"
        }]
        }],
          numberOfChoices: "false"
        }, {
          isnewLanguage: "true",
          label: "label1",
          languages: [{
          language: "Chinece",
          questions: [{
          choices: "choicesChinece",
          fields: "false",
          mainText: "MainTextChinece1",
          subText: "SubTextChinece1"
        }]
        }],
          numberOfChoices: "false"
        }, {
          isnewLanguage: "true",
          label: "label2",
          languages: [{
          language: "Italian",
          questions: [{
          choices: "choicesItalian2",
          fields: "false",
          mainText: "MAinTextItalian2",
          subText: "SubTextItalian2"
        }]
        }],
          numberOfChoices: "false"
        }]
    

Below is the required structure. Each object with the same label value should be appended to one object with the new languages.

var theRequiredStructure = [{
      isnewLanguage: "true",
      label: "label1",
      languagesTest: [{
      language: "English",
      questions: [{
      choices: "choices1",
      fields: "false",
      mainText: "MAinText1",
      subText: "SubText1"
    }]
    }, {
      language: "Italian",
      questions: [{
      choices: "choicesItalian1",
      fields: "false",
      mainText: "MainTextItalian1",
      subText: "SubTextItalian1"
    }]
    }, {
      language: "Chinece",
      questions: [{
      choices: "choicesChinece",
      fields: "false",
      mainText: "MainTextChinece1",
      subText: "SubTextChinece1"
    }]
    }],
      numberOfChoices: "false"
    },
    {
      isnewLanguage: "true",
      label: "label2",
      languagesTest: [{
      language: "English",
      questions: [{
     choices: "choices2",
      fields: "false",
      mainText: "MAinText2",
      subText: "SubText2"
    }]
    }, {
      language: "Italian",
      questions: [{
      choices: "choicesItalian2",
      fields: "false",
      mainText: "MainTextItalian2",
      subText: "SubTextItalian2"
    }]
    }, {
      language: "Chinece",
      questions: [{
      choices: "choicesChinece2",
      fields: "false",
      mainText: "MainTextChinece2",
      subText: "SubTextChinece2"
    }]
    }],
      numberOfChoices: "false"
    }

Here is my work but obviously it works only for the first element. How can I achieve the required structure for all elements? I prefer mostly ES5 solutions which is understandable to me. Thanks for taking the time

var test = [{
      isnewLanguage: "false",
      label: "label1",
      languages: [{
      language: "English",
      questions: [{
      choices: "choices1",
      fields: "false",
      mainText: "MAinText1",
      subText: "SubText1"
    }]
    }],
      numberOfChoices: "5"
    }, {
      isnewLanguage: "false",
      label: "label2",
      languages: [{
      language: "English",
      questions: [{
      choices: "choices2",
      fields: "false",
      mainText: "MAinText2",
      subText: "SubText2"
    }]
    }],
      numberOfChoices: "5"
    }, {
      isnewLanguage: "true",
      label: "label1",
      languages: [{
      language: "Italian",
      questions: [{
      choices: "choicesItalian1",
      fields: "false",
      mainText: "MainTextItalian1",
      subText: "SubTextItalian1"
    }]
    }],
      numberOfChoices: "false"
    }, {
      isnewLanguage: "true",
      label: "label2",
      languages: [{
      language: "Italian",
      questions: [{
      choices: "choicesItalian2",
      fields: "false",
      mainText: "MAinTextItalian2",
      subText: "SubTextItalian2"
    }]
    }],
      numberOfChoices: "false"
    }, {
      isnewLanguage: "true",
      label: "label1",
      languages: [{
      language: "Chinece",
      questions: [{
      choices: "choicesChinece",
      fields: "false",
      mainText: "MainTextChinece1",
      subText: "SubTextChinece1"
    }]
    }],
      numberOfChoices: "false"
    }, {
      isnewLanguage: "true",
      label: "label2",
      languages: [{
      language: "Italian",
      questions: [{
      choices: "choicesItalian2",
      fields: "false",
      mainText: "MAinTextItalian2",
      subText: "SubTextItalian2"
    }]
    }],
      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)

2 Answers 2

1

Do you mean something like this? It's just a draft code, only to show you the logic (one of possible ways). Read comments in the code below

var test = [{
  isnewLanguage: "false",
  label: "label1",
  languages: [{
    language: "English",
    questions: [{
      choices: "choices1",
      fields: "false",
      mainText: "MAinText1",
      subText: "SubText1"
    }]
  }],
  numberOfChoices: "5"
}, {
  isnewLanguage: "false",
  label: "label2",
  languages: [{
    language: "English",
    questions: [{
      choices: "choices2",
      fields: "false",
      mainText: "MAinText2",
      subText: "SubText2"
    }]
  }],
  numberOfChoices: "5"
}, {
  isnewLanguage: "true",
  label: "label1",
  languages: [{
    language: "Italian",
    questions: [{
      choices: "choicesItalian1",
      fields: "false",
      mainText: "MainTextItalian1",
      subText: "SubTextItalian1"
    }]
  }],
  numberOfChoices: "false"
}, {
  isnewLanguage: "true",
  label: "label2",
  languages: [{
    language: "Italian",
    questions: [{
      choices: "choicesItalian2",
      fields: "false",
      mainText: "MAinTextItalian2",
      subText: "SubTextItalian2"
    }]
  }],
  numberOfChoices: "false"
}, {
  isnewLanguage: "true",
  label: "label1",
  languages: [{
    language: "Chinece",
    questions: [{
      choices: "choicesChinece",
      fields: "false",
      mainText: "MainTextChinece1",
      subText: "SubTextChinece1"
    }]
  }],
  numberOfChoices: "false"
}, {
  isnewLanguage: "true",
  label: "label2",
  languages: [{
    language: "Italian",
    questions: [{
      choices: "choicesItalian2",
      fields: "false",
      mainText: "MAinTextItalian2",
      subText: "SubTextItalian2"
    }]
  }],
  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);

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks a lot for your effort but unfortunately not I do not need this kind of structure. The objects with the same label should be merged in one obj and the different languages with the same label should be pushed in a new array. Above theRequiredStructture json shows what do I need
@ioan-dimi check it now, there was little bug
1

You can do it like this also:

var test = [{
    isnewLanguage: "false",
    label: "label1",
    languages: [{
        language: "English",
        questions: [{
            choices: "choices1",
            fields: "false",
            mainText: "MAinText1",
            subText: "SubText1"
        }]
    }],
    numberOfChoices: "5"
}, {
    isnewLanguage: "false",
    label: "label2",
    languages: [{
        language: "English",
        questions: [{
            choices: "choices2",
            fields: "false",
            mainText: "MAinText2",
            subText: "SubText2"
        }]
    }],
    numberOfChoices: "5"
}, {
    isnewLanguage: "true",
    label: "label1",
    languages: [{
        language: "Italian",
        questions: [{
            choices: "choicesItalian1",
            fields: "false",
            mainText: "MainTextItalian1",
            subText: "SubTextItalian1"
        }]
    }],
    numberOfChoices: "false"
}, {
    isnewLanguage: "true",
    label: "label2",
    languages: [{
        language: "Italian",
        questions: [{
            choices: "choicesItalian2",
            fields: "false",
            mainText: "MAinTextItalian2",
            subText: "SubTextItalian2"
        }]
    }],
    numberOfChoices: "false"
}, {
    isnewLanguage: "true",
    label: "label1",
    languages: [{
        language: "Chinece",
        questions: [{
            choices: "choicesChinece",
            fields: "false",
            mainText: "MainTextChinece1",
            subText: "SubTextChinece1"
        }]
    }],
    numberOfChoices: "false"
}, {
    isnewLanguage: "true",
    label: "label2",
    languages: [{
        language: "Italian",
        questions: [{
            choices: "choicesItalian2",
            fields: "false",
            mainText: "MAinTextItalian2",
            subText: "SubTextItalian2"
        }]
    }],
    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);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.