#javascript #arrays #object #filter
#javascript #массивы #объект #Фильтр
Вопрос:
У меня есть этот массив объектов. Каждый объект имеет уникальную метку значения. Я хотел бы сравнить их по значению метки, и если значение совпадает, должен быть создан новый объект с уникальным значением.
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 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"
}
Вот моя работа, но, очевидно, она работает только для первого элемента. Как я могу достичь требуемой структуры для всех элементов? Я предпочитаю в основном решения ES5, которые мне понятны. Спасибо, что нашли время
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)
Ответ №1:
Вы имеете в виду что-то вроде этого? Это всего лишь черновик кода, только для того, чтобы показать вам логику (один из возможных способов). Прочитайте комментарии в коде ниже
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] amp;amp; 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);
Комментарии:
1. Большое спасибо за ваши усилия, но, к сожалению, нет, мне не нужна такая структура. Объекты с одинаковой меткой должны быть объединены в один объект, а разные языки с одинаковой меткой должны быть помещены в новый массив. Выше требуемая структура json показывает, что мне нужно
2. @ioan-dimi проверьте это сейчас, была небольшая ошибка
Ответ №2:
Вы также можете сделать это следующим образом:
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);