J'essaye de créer un objet javascript qui me permettrait facilement de vérifier combien de chapitres il y a dans un certain livre et combien de vers il y a dans un certain chapitre.
Mon plan est d'avoir une structure comme celle-ci pour l'objet:
const amounts = {
book: {
bookNumber: 1,
bookChapters: 50,
chapter:
{
chapterNumber: 1,
versesInChapter: 31
},
chapter:
{
chapterNumber: 2,
versesInChapter: 25
}
},
book: {
bookNumber: 2,
bookChapters: 40,
chapter:
{
chapterNumber: 1,
versesInChapter: 26
},
chapter:
{
chapterNumber: 2,
versesInChapter: 22
}
}
}
Comment pourrais-je accéder aux valeurs imbriquées d'une telle structure basée sur des valeurs de variables? Par exemple, je pourrais avoir un var bookNum = 2 et var chapitreNum = 2 et mon objectif serait d'obtenir le nombre de versets du chapitre 2 dans le livre 2. Comment écrire une telle requête?
EDIT: Sur la base des commentaires, ma structure d'objet est également mauvaise, donc je demande également de souligner la structure correcte qui me permettrait d'accéder efficacement au nombre de versets.
p>
3 Réponses :
Vous pouvez réécrire vos montants var comme ci-dessous, car cela vous aidera à la manipulation
const books = [{
bookNumber: 1,
bookChapters: 50,
chapter: [{
chapterNumber: 1,
versesInChapter: 31
},
{
chapterNumber: 2,
versesInChapter: 25
}
],
},
{
bookNumber: 2,
bookChapters: 40,
chapter: [{
chapterNumber: 1,
versesInChapter: 26
},
{
chapterNumber: 2,
versesInChapter: 22
}
]
}
]
var serach = books.filter(function(book) {
//console.log("books",book);
return book.bookNumber == 1;
})[0];
console.log("Searched book!", serach)
//And for desired result you can use forEach and filter
var num = 2,
chap = 1,
found_chapter;
books.forEach(function(book) {
if (book.bookNumber == num) { //found the book
console.log("found book", book);
found_chapter = book.chapter.filter(function(chapter) {
return chapter.chapterNumber == chap; //found chapter WRT found book
})[0]
}
});
console.log("found chapter-", found_chapter, "--found verse", found_chapter.versesInChapter)
const books = [
{
bookNumber: 1,
bookChapters: 50,
chapter:[
{
chapterNumber: 1,
versesInChapter: 31
},
{
chapterNumber: 2,
versesInChapter: 25
}
],
}
{
bookNumber: 2,
bookChapters: 40,
chapter:[
{
chapterNumber: 1,
versesInChapter: 26
},
{
chapterNumber: 2,
versesInChapter: 22
}
]
}
]
Et comme un extrait de code ci-dessus, vous pouvez filtrer vos données de recherche et pouvez facilement les boucler à nouveau pour trouver le résultat souhaité
J'espère que cela vous aidera!
p >
Et le numéro de chapitre? De plus, cela ne semble pas renvoyer le résultat souhaité, OP cherche à renvoyer versesInChapter à partir de l'objet.
Vous pouvez structurer ces données de deux manières; comme tableau ou comme objet.
Méthode 1 (objet)
Comme les livres sont indexés par bookNumber , il serait logique que le bookNumber soit une clé dans un objet.
Cela peut être réduit à:
const books = [
[31,25],
[26,22]
];
// es6 style function. Same as `function getVerses(bookNum, chapterNum){...}`
getVerses = (bookNum, chapterNum) => {
bookNum--;
chapterNum--;
if (books[bookNum] && books[bookNum][chapterNum]) {
return books[bookNum][chapterNum];
} else {
// Notify that the index is not set
console.warn('Warning: Book or chapter number is not defined!');
// Return 0 as deafult
return 0;
}
}
let bookNum = 2;
let chapterNum = 2;
let numOfVerses = getVerses(bookNum, chapterNum);
console.log(`Book ${bookNum} chapter ${chapterNum} has ${numOfVerses} verses.`);J'ai ajouté quelques commentaires dans mon code pour aider à clarifier.
[ [versesInChapter/*1*/,versesInChapter/*2*/, ...], ... ]
Méthode 2 (tableau)
Si ces livres doivent être séquentiels, un tableau fonctionnerait également.
const books = {
1: {
1: 31,
2: 25
},
2 /*bookNumber*/: {
1 /*chapterNumber*/: 26 /*versesInChapter*/ ,
2 /*chapterNumber*/: 22 /*versesInChapter*/
}
};
// es6 style function. Same as `function getVerses(bookNum, chapterNum){...}`
getVerses = (bookNum, chapterNum) => {
if (books[bookNum] && books[bookNum][chapterNum]) {
return books[bookNum][chapterNum];
} else {
// Notify that the index is not set
console.warn('Warning: Book or chapter number is not defined!');
// Return 0 as deafult
return 0;
}
}
let bookNum = 2;
let chapterNum = 2;
let numOfVerses = getVerses(bookNum, chapterNum);
console.log(`Book ${bookNum} chapter ${chapterNum} has ${numOfVerses} verses.`);
J'apprécie vos efforts pour garder un objet de livre petit. Le problème avec ceci est que le code devient un peu difficile à lire et qu'à l'avenir, si des éléments sont ajoutés dans l'objet livres, il sera très difficile d'incorporer ces modifications sans changer / casser les fonctionnalités existantes, mais cela résoudra certainement le problème actuel. :)
J'ai beaucoup aimé cette solution, j'ai fini par implémenter la méthode de tableau et cela fonctionne très bien!
Heureux de l'entendre! GL HF
Vous pouvez structurer les livres et chapitres sous forme de tableaux. Ensuite, vous pouvez accéder à chaque élément de données qu'ils contiennent comme:
var books = [
{
name: "Book1",
chapters: [
{ countOfVerses: 31 },
{ countOfVerses: 20 }
]
},
{
name: "Book2",
chapters: [
{ countOfVerses: 12 },
{ countOfVerses: 20 },
{ countOfVerses: 16 },
{ countOfVerses: 22 }
]
}
];
for (let book of books){
let name = book.name; // Now we know which book it is...
let chapterCount = book.chapters.length; // ...and how many chapters it has
console.log(`${name} has ${chapterCount} chapters:`)
for (let i = 0; i < chapterCount; i++){
let chapter = book.chapters[i]; // Look in each chapter in the book...
let verses = chapter.countOfVerses; //...and get the countOfVerses property
console.log(` Chapter ${i+1} has ${verses} verses`);
}
}
Le
chapitren'est-il pas censé être un tableau? Et, d'ailleurs, chaquelivrene devrait-il pas avoir un nom unique? Actuellement, la dernière propriété remplace la première, vous laissant avec un seul livre contenant un seul chapitre.Pas sûr, cela aiderait-il? Ne peut-il pas être simplement un objet imbriqué? Je suis assez nouveau dans ce domaine.
Vous avez deux mêmes clés
bookqui écraseront la première. Et il en sera de même avec lechapitreDeux clés identiques - la dernière valeur remplacera la première valeur.
Je modifierai mon message pour souligner que je pourrais également avoir besoin d'une meilleure structure pour l'objet.