javascript - masalah penggabungan atribut tatasusunan objek js
我想大声告诉你
我想大声告诉你 2017-05-19 10:36:44
0
3
832

Semasa saya sedang mengerjakan fungsi pilihan soalan, saya menghadapi masalah gabungan ini. Terdapat soalan pilihan tunggal dan pilihan tunggal tiada masalah untuk setiap soalan pelbagai pilihan. Keputusan pemilihan adalah seperti gambar di bawah:

Saya perlu menggabungkan data soalan aneka pilihan yang sama menjadi satu, iaitu objek dalam bahagian pemilihan kotak biru dalam gambar digabungkan menjadi satu, pilihan menjadi "cubit, picit", dan ID lain diabaikan . Adakah terdapat cara mudah untuk mencapai ini. Berlutut dan terima kasih!

我想大声告诉你
我想大声告诉你

membalas semua(3)
为情所困

Idea asas ialah merentasi data dahulu, menyimpan soalan soalan yang sama seperti tatasusunan, kemudian melintasi tatasusunan yang berurusan dengan soalan yang sama, dan sambungkan jawapan bersama-sama.

Contoh:
Data:

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: '你喜欢的歌曲'
}];

//Kategori soalan yang sama

// 给相同题目分类
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": "你喜欢的歌曲"
//     }
//   ]
// }

Isi soalan daripada jenis yang sama, dan masukkan semua soalan berikut ke dalam soalan pertama.
dan simpan semula dalam format asal

// 用于按照原格式存放最后的数据
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": "你喜欢的歌曲"
//   }
// ]

Kemas kini

Setelah membaca jawapan di tingkat 2, sebenarnya proses sebelum ini boleh dipermudahkan, tetapi seperti kata tingkat 3, ia tidak ada kena mengena dengan peta ES6. Saya menggunakan forEach ES5. Daripada menggunakan ES5, gunakan sahaja ES3 Tidak ada masalah sama sekali jika anda menggantikannya dengan gelung normal. Menggunakan peta agak rumit. 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

Oleh kerana tidak perlu mengklasifikasikan data soalan, jawapan boleh disambung terus tanpa mengklasifikasikannya terlebih dahulu rrreee

data2 yang keluar adalah dalam bentuk objek Jika anda memerlukan tatasusunan, proses sahaja. Saya masih perlu bersetuju dengan perkara di tingkat tiga. Walaupun ia adalah soalan berbilang pilihan, data asal tidak seharusnya disusun mengikut cara yang anda senaraikan.

Bukankah ini cara yang lebih baik untuk mengendalikannya secara langsung semasa mengira jawapan yang dipilih kepada soalan aneka pilihan? 🎜🎜
漂亮男人

Menyediakan idea yang menyeronokkan yang boleh dilaksanakan, tetapi mungkin tidak boleh digunakan untuk senario sebenar
Tentukan objek kosong, gelung melalui tatasusunan, dan kemudian atribut objek kosong dinamakan tajuk dan nilai yang sepadan ialah tajuk; nilai ialah tatasusunan, dan pilihan Tolak masuk. Sudah tentu, ini juga mungkin melibatkan isu penyingkiran pendua dalam setiap soalan Hasil akhir mungkin serupa dengan ini

obj['动作'] = ['抓','捏']; 

Jika anda boleh menggunakan es6, saya syorkan Map

巴扎黑

Kaedah di tingkat 1 boleh menyelesaikan masalah ini
Peta di tingkat 2 tidak perlu es6
Tingkat 3 enggan menjawab soalan ini kerana dia merasakan kaedah pelaksanaan ini tidak betul

.
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan