Maison > Questions et réponses > le corps du texte
Lorsque je travaillais sur une fonction d'option de question, j'ai rencontré ce problème de fusion. Il existe des questions à choix unique et à choix multiple. Chaque question à choix multiple entraînera plusieurs réponses. Le résultat de la sélection est similaire à l'image ci-dessous :
Je dois fusionner les données de la même question à choix multiples en une seule, c'est-à-dire que les objets dans la partie de sélection de la boîte bleue dans l'image sont fusionnés en un seul, l'option devient "pincer, presser" et les autres identifiants sont ignoré. Existe-t-il un moyen simple d'y parvenir. Agenouillez-vous et merci !
为情所困2017-05-19 10:38:44
Une idée de base est de parcourir d'abord les données, de sauvegarder les questions de la même question sous forme de tableau, puis de parcourir les tableaux traitant de la même question et de regrouper les réponses ensemble.
Exemple :
Données :
var questions = [{
id: Math.random() * 100000 >> 0,
option: 'x',
questionId: 1,
title: '你的名字'
}, {
id: Math.random() * 100000 >> 0,
option: '动作1',
questionId: 2,
title: '你喜欢的动作'
}, {
id: Math.random() * 100000 >> 0,
option: '动作2',
questionId: 2,
title: '你喜欢的动作'
}, {
id: Math.random() * 100000 >> 0,
option: '动作3',
questionId: 2,
title: '你喜欢的动作'
}, {
id: Math.random() * 100000 >> 0,
option: '动作4',
questionId: 2,
title: '你喜欢的动作'
}, {
id: Math.random() * 100000 >> 0,
option: '动作5',
questionId: 2,
title: '你喜欢的动作'
}, {
id: Math.random() * 100000 >> 0,
option: '歌曲1',
questionId: 3,
title: '你喜欢的歌曲'
}, {
id: Math.random() * 100000 >> 0,
option: '歌曲2',
questionId: 3,
title: '你喜欢的歌曲'
}, {
id: Math.random() * 100000 >> 0,
option: '歌曲3',
questionId: 3,
title: '你喜欢的歌曲'
}];
//Catégorie les mêmes questions
// 给相同题目分类
var categories = {};
questions.forEach(function (item, i) {
if (!categories[item.questionId]) {
categories[item.questionId] = [item];
} else {
categories[item.questionId].push(item);
}
});
console.log(JSON.stringify(categories, 0, 2));
// {
// "1": [
// {
// "id": 76350,
// "option": "x",
// "questionId": 1,
// "title": "你的名字"
// }
// ],
// "2": [
// {
// "id": 42682,
// "option": "动作1",
// "questionId": 2,
// "title": "你喜欢的动作"
// },
// {
// "id": 19378,
// "option": "动作2",
// "questionId": 2,
// "title": "你喜欢的动作"
// },
// {
// "id": 25613,
// "option": "动作3",
// "questionId": 2,
// "title": "你喜欢的动作"
// },
// {
// "id": 25020,
// "option": "动作4",
// "questionId": 2,
// "title": "你喜欢的动作"
// },
// {
// "id": 70897,
// "option": "动作5",
// "questionId": 2,
// "title": "你喜欢的动作"
// }
// ],
// "3": [
// {
// "id": 38775,
// "option": "歌曲1",
// "questionId": 3,
// "title": "你喜欢的歌曲"
// },
// {
// "id": 50039,
// "option": "歌曲2",
// "questionId": 3,
// "title": "你喜欢的歌曲"
// },
// {
// "id": 71712,
// "option": "歌曲3",
// "questionId": 3,
// "title": "你喜欢的歌曲"
// }
// ]
// }
Traversez les questions du même type et placez toutes les questions suivantes dans la première.
et re-stockez-le dans le format original
// 用于按照原格式存放最后的数据
var data =[];
for (var key in categories) {
var i, l;
if (categories.hasOwnProperty(key)) {
for (i = 1; i < categories[key].length; ++i) {
// 第一个的值 = ',' + 下一个的值
categories[key][0].option += ',' + categories[key][i].option;
// 删除下一个
categories[key].splice(i, 1);
--i;
}
data.push(categories[key][0]);
}
}
console.log('categories',JSON.stringify(categories, null, 2));
console.log('data',JSON.stringify(data, null, 2));
// 'categories' {
// "1": [
// {
// "id": 72749,
// "option": "x",
// "questionId": 1,
// "title": "你的名字"
// }
// ],
// "2": [
// {
// "id": 33498,
// "option": "动作1,动作2,动作3,动作4,动作5",
// "questionId": 2,
// "title": "你喜欢的动作"
// }
// ],
// "3": [
// {
// "id": 79801,
// "option": "歌曲1,歌曲2,歌曲3",
// "questionId": 3,
// "title": "你喜欢的歌曲"
// }
// ]
// }
// 'data' [
// {
// "id": 72749,
// "option": "x",
// "questionId": 1,
// "title": "你的名字"
// },
// {
// "id": 33498,
// "option": "动作1,动作2,动作3,动作4,动作5",
// "questionId": 2,
// "title": "你喜欢的动作"
// },
// {
// "id": 79801,
// "option": "歌曲1,歌曲2,歌曲3",
// "questionId": 3,
// "title": "你喜欢的歌曲"
// }
// ]
Après avoir lu la réponse au 2ème étage, en effet, le processus précédent peut être simplifié, mais comme l'a dit le 3ème étage, cela n'a rien à voir avec la carte ES6. J'ai utilisé forEach
d'ES5. Au lieu d'utiliser ES5, utilisez simplement ES3. Il n'y a aucun problème si vous le remplacez par une boucle for normale. Utiliser la carte est assez compliqué. forEach
。不用ES5,只用ES3,换成普通for循环完全没有问题的。使用map反而负复杂了。
由于不需要分类的题目数据,所以可以直接拼接答案,不用先归类了,实现如下:
var data2 = {};
questions.forEach(function (item, i) {
if (!data2[item.questionId]) {
data2[item.questionId] = item;
} else {
data2[item.questionId].option += ',' + item.option;
}
});
console.log(JSON.stringify(data2,null,2));
// {
// "1": {
// "id": 60348,
// "option": "x",
// "questionId": 1,
// "title": "你的名字"
// },
// "2": {
// "id": 33956,
// "option": "动作1,动作2,动作3,动作4,动作5",
// "questionId": 2,
// "title": "你喜欢的动作"
// },
// "3": {
// "id": 48194,
// "option": "歌曲1,歌曲2,歌曲3",
// "questionId": 3,
// "title": "你喜欢的歌曲"
// }
// }
这样出来的data2
rrreee
Le data2
qui sort se présente sous la forme d'un objet. Si vous avez besoin d'un tableau, traitez-le simplement.
漂亮男人2017-05-19 10:38:44
Fournit une idée amusante qui peut être mise en œuvre, mais peut ne pas être applicable à des scénarios réels
Définissez un objet vide, parcourez le tableau, puis l'attribut de l'objet vide est appelé titre et le correspondant ; value est le titre ; value En tant que tableau, insérez les options. Bien sûr, cela peut également impliquer le problème de la suppression des doublons dans chaque question. Le résultat final est probablement similaire à celui-ci
obj['动作'] = ['抓','捏'];
Si vous savez utiliser es6, je vous recommande Map
巴扎黑2017-05-19 10:38:44
La méthode du 1er étage peut résoudre ce problème,
La carte du 2ème étage n'a pas besoin d'être es6
Le 3ème étage a refusé de répondre à cette question car il estimait que cette méthode de mise en œuvre ce n'était pas bien#🎜🎜 #