Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于字符串变量访问嵌套javascript对象_Javascript_Jquery - Fatal编程技术网

基于字符串变量访问嵌套javascript对象

基于字符串变量访问嵌套javascript对象,javascript,jquery,Javascript,Jquery,我正在尝试创建一个javascript对象,它可以让我轻松地检查某本书中有多少章节,以及某一章节中有多少诗句 我的计划是为对象创建一个类似这样的结构: const amounts = { book: { bookNumber: 1, bookChapters: 50, chapter: { chapterNumber: 1, versesInChapter: 31

我正在尝试创建一个javascript对象,它可以让我轻松地检查某本书中有多少章节,以及某一章节中有多少诗句

我的计划是为对象创建一个类似这样的结构:

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
        }
    }

}
如何基于变量值访问此类结构的嵌套值?例如,我可能有一个var bookNum=2和var chapterNum=2,我的目标是在第2册中获得第2章中的诗句数量。我将如何编写这样一个查询


编辑:根据评论,我的对象结构也不好,因此我要求指出正确的结构,使我能够有效地访问诗句的数量。

您可以按照以下格式重写您的var金额,这将有助于操作

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
        }
    ]
    }

]
const book=[{
书号:1,,
书章:50,
第章:[{
第1章:,
诗集:31
},
{
第二章,
第25节
}
],
},
{
书号:2,,
书章:40,
第章:[{
第1章:,
第26节
},
{
第二章,
诗集:22
}
]
}
]
var serach=books.filter(函数(book){
//console.log(“books”,book);
还书。书号==1;
})[0];
log(“搜索过的书!”,serach)
//为了获得理想的结果,您可以使用forEach和filter
var num=2,
chap=1,
第二章;
books.forEach(函数(book){
如果(book.bookNumber==num){//找到了该书
console.log(“找到的书”,book);
查找章节=book.chapter.filter(函数(章节){
return chapter.chapterNumber==chap;//找到章节WRT找到书籍
})[0]
}
});

log(“发现的章节-”,发现的章节,“--find verse”,发现的章节.versesInChapter)
您可以用两种方式构造此数据;作为
数组
或作为
对象

方法1(对象)

由于书籍由
bookNumber
索引,因此将
bookNumber
作为对象中的键是有意义的

这可以归结为:

{
  bookNumber: {
    chapterNumber: versesInChapter, 
     ...
  }, 
  ...
}
我在代码中添加了一些注释以帮助澄清

const book={
1: {
1: 31,
2: 25
},
2/*书号*/:{
第1/*章编号*/:26/*节内容*/,
第2/*章编号*/:22/*节*/
}
};
//es6风格的功能。与`函数getVerses(bookNum,chapterNum){…}相同`
getVerses=(bookNum,chapterNum)=>{
if(books[bookNum]&&books[bookNum][chapterNum]){
还书[bookNum][chapterNum];
}否则{
//通知未设置索引
console.warn('警告:未定义书籍或章节号!');
//将0返回为deafult
返回0;
}
}
设bookNum=2;
设chapterNum=2;
设numforverses=getVerses(bookNum,chapterNum);

log(`Book${bookNum}章${chapterNum}有${numforses}节。`)您可以将
书籍
章节
组织为数组。然后您可以访问其中的每一条数据,如:

var书籍=[
{
名称:“第一册”,
章节:[
{countOfVerses:31},
{countOfVerses:20}
]
},
{
名称:“第二册”,
章节:[
{countOfVerses:12},
{countOfVerses:20},
{countOfVerses:16},
{countOfVerses:22}
]
}    
];
为了(让书成为书){
让name=book.name;//现在我们知道它是哪本书了。。。
让chapterCount=book.chapters.length;/…以及它有多少章
log(`${name}有${chapterCount}章:`)
for(设i=0;i}
章节
不就是一个数组吗?就这一点而言,不是每本书都应该有一个唯一的名字吗?目前,最后一个属性将覆盖第一个属性,只剩下一本包含一章的书。不确定,这会有帮助吗?它不能只是一个嵌套对象吗?我对这东西很陌生。你有两个相同的键
book
,这将覆盖第一个键。同样的情况也会发生在
chapter
两个相同的键上-后面的值将覆盖第一个值。我将编辑我的帖子,指出我可能还需要一个更好的对象结构。章节号如何?此外,这似乎没有返回所需的结果,OP正在查找从对象返回的
versesInChapter
。我感谢您努力使books对象保持较小。问题是代码变得有点难以阅读,将来如果在books对象中添加内容,在不更改/破坏现有功能的情况下合并这些更改将非常困难,但它肯定会解决当前的问题。:)我非常喜欢这个解决方案,最终实现了数组方法,效果非常好!很高兴听到这个消息!GLHF