如何在多级对象中查找键值对?

时间:2019-01-26 16:59:17

标签: javascript key-value

我在Angular项目中使用了这种数据结构。我不确定Angular的确有用,但也许有好处:

const content = [
    {
        "id": 1, // language id
        "name": "english",
        "code": "en",
        "menus": [
            {
                "id": 1, // group id
                "lang_id": 1,
                "name": "Default",
                "items": [
                    {
                        "id": 2, // item id
                        "name": "About us",
                        "menu_id": 1,
                        "is_hidden": 0,
                        // ...
                    },
                ],
            },
            // ...
        ],
    },
    // ...
]

我也知道这些变量名的语言,组和项目的id

private lang_id = 1;
private group_id = 1;
private item_id = 2;

在数据结构中,我有许多带有“组”的“语言”,而我在“组”中有很多的“项目”。

我尝试使用此代码,但我认为这里需要更好的选择:

let indexLang: number;
let indexGroup: number;

for (let i = 0; i < this.content.length; i++) {
  if ( this.content[i].id === this.lang_id) {
    indexLang = i;
    break;
  }
}
for (let i = 0; i < this.content[indexLang].menus.length; i++) {
  if ( this.content[indexLang].menus[i].id === this.group_id) {
    indexGroup = i;
    break;
  }
}
// and another for loop to find the item...

是否有更好的方法来找到资源最少的is_hidden键值对?

1 个答案:

答案 0 :(得分:1)

您正在寻找Array.prototype.find

const content = [
    {
        "id": 1, // language id
        "name": "english",
        "code": "en",
        "menus": [
            {
                "id": 1, // group id
                "lang_id": 1,
                "name": "Default",
                "items": [
                    {
                        "id": 2, // item id
                        "name": "About us",
                        "menu_id": 1,
                        "is_hidden": 0,
                        // ...
                    },
                ],
            },
            // ...
        ],
    },
    // ...
]

let lang_id = 1;
let group_id = 1;
let item_id = 2;

let language = content.find(item => item.id === lang_id);
let group = language.menus.find(item => item.id === group_id);
let item = group.items.find(item => item.id === item_id);

console.dir(item)

对于其中一个ID不存在的情况,您肯定需要添加一些错误处理。您可以将这些发现链接起来:

try {
  let item = content.find(item => item.id === lang_id)
               .menus.find(item => item.id === group_id)
               .items.find(item => item.id === item_id);
} catch( err ) {
   // one of the ids did not exists
}