Javascript 如何遍历此对象?

Javascript 如何遍历此对象?,javascript,Javascript,我想通过创建函数country(state,foods) 如果对象中存在state和foods,它应该返回该状态的state名称和foods数组。首先,我尝试通过在函数中使用for in传递参数state来仅迭代state,但我仍然没有获得state名称,我不知道如何获得foods数组 var india = [ { "state": "karnataka", "capital": "Bengaluru",

我想通过创建
函数country(state,foods)
如果对象中存在state和foods,它应该返回该状态的state名称和foods数组。首先,我尝试通过在函数中使用
for in
传递参数state来仅迭代state,但我仍然没有获得state名称,我不知道如何获得foods数组

var india = [
        {
            "state": "karnataka",
            "capital": "Bengaluru",
            "foods": ["Mysore masala", "Uthhappa", "Bisi Bele Bhaat"]
        },
        {
            "state": "Maharashtra",
            "capital": "Mumbai",
            "foods": ["vada pav", "puranpoli", "Missal pav"]
        },

        {
            "state": "Tamil nadu",
            "capital": "Chennai",
            "foods": ["Medu vada", "aapam", "idli sambhar"]
        },

        {
            "state": "Rajasthan",
            "capital": "Jaipur",
            "foods": ["Ras malai", "Kadka", "Gujia"]

        }
    ];
或者因为
india
是一个数组:

for (var i = 0; i < india.length; ++i)
{
    // same thing
}
函数
StateHasFood(state,food)
可以是这样的:

function StateHasFood(state, food)
{
    for (var i in india)
        if (india[i].state == state)
            return india[i].foods.indexOf(food) >= 0;
    return false;
}
当然,您也可以返回相对于包含其属性的状态的对象,包括它的名称和您想要的食物的完整列表:

function StateHasFood(state, food)
{
    for (var i in india)
        if (india[i].state == state)
            if (india[i].foods.indexOf(food) >= 0)
                return india[i];
    return false;
}

这是一个很差的数据结构,所以如果你经常需要搜索这个数据,你可以考虑将状态名作为对象的属性,用于O(1)查找而不是O(n)迭代这个数组的方法。也就是说,在本例中可以使用Array.find()搜索现有结构

尝试使用
forEach()
方法进行迭代,并使用
Object.keys
获取key:value对。我不完全理解OP的目标,所以我将添加
objArrKey()
。此函数获取数组和特定键,并返回与所述键相关的所有值

一小条
var印度=[{
“州”:“卡纳塔克邦”,
“首都”:“班加罗鲁”,
“食品”:[
“Mysoremasala”,
“乌萨帕”,
“BisiBeleBhaat”
]
}, {
“国家”:“马哈拉施特拉邦”,
“首都”:“孟买”,
“食品”:[
“瓦达帕夫”,
“puranpoli”,
“米萨尔帕夫”
]
}, {
“州”:“泰米尔纳德邦”,
“首都”:“钦奈”,
“食品”:[
“Meduvada”,
“aapam”,
“伊德利桑巴”
]
}, {
“国家”:“拉贾斯坦邦”,
“首都”:“斋浦尔”,
“食品”:[
“拉斯马拉伊”,
“卡德卡”,
“古家”
]
}]
印度。forEach(功能(项目){
Object.key(item).forEach(function(key){
console.log(“键:+key+”值:+item[key]);
});
});
功能对象(arr,键){
返回arr.map(函数(项){
返回项[键]| |空;
});
}
console.log(objArrKey(印度,['state']);
console.log(objArrKey(印度,['capital']);

console.log(objArrKey(印度,['foods'])因为你刚刚告诉我写一个函数来检查状态和资本是否存在,这是真的,然后返回资本。这是我为你写的。希望有帮助:)

var印度=[
{
“州”:“卡纳塔克邦”,
“首都”:“班加罗鲁”,
“食品”:[“Mysore masala”、“Uthappa”、“Bisi Bele Bhaat”]
},
{
“国家”:“马哈拉施特拉邦”,
“首都”:“孟买”,
“食品”:[“vada pav”、“puranpoli”、“Missal pav”]
},
{
“州”:“泰米尔纳德邦”,
“首都”:“钦奈”,
“食品”:[“Medu vada”、“aapam”、“idli sambhar”]
},
{
“国家”:“拉贾斯坦邦”,
“首都”:“斋浦尔”,
“食品”:[“拉斯马莱”、“卡德卡”、“古家”]
}
];
职能国家(一些州,一些首都){
for(印度的var i)
{
如果(印度[i]。州===someState&&india[i]。资本===someCapital){
返回印度[i]。首都;
}
}
}

文件。书写(国家(“泰米尔纳德邦”、“钦奈”)从您在注释中添加的内容来看,您真正想要的似乎是一个函数
getPropForState(state,prop)
,它将返回与指定状态关联的指定属性的值。也就是说,
getPropForState(“拉贾斯坦邦”,“食品”)
将返回一个食品数组,
getPropForState(“拉贾斯坦邦”,“首都”)
将返回
“斋浦尔”

假设是这样的话,可能是这样的:

//与所讨论的数组相同,但已删除换行符
//这样就不会把我的答案弄乱了
var india=[{“州”:“卡纳塔克邦”,“首都”:“班加罗鲁”,“食品”:[“迈索尔·马萨拉”,“乌萨帕”,“比西·贝勒·巴特”],{“州”:“马哈拉施特拉邦”,“首都”:“孟买”,“食品”:[“瓦达·帕夫”,“普兰波利”,“帕夫夫人”],{“州”:“泰米尔纳德邦”,“首都”:“钦奈”,“食品”:[“梅杜瓦达”,“阿帕姆”,“伊德利·桑巴”],{“州”:“拉贾斯坦邦”,“首都”:“斋浦尔”,“食品”:“马拉斯”","卡德卡","古家",;
函数getPropForState(状态,属性){
var item=india.find(v=>v.state==state);
如果(项目)
归还物品[道具];
}
console.log(getPropForState(“拉贾斯坦邦”、“食品”);//返回[“Ras malai”、“Kadka”、“Gujia”]
console.log(getPropForState(“拉贾斯坦邦”、“首都”);//返回“斋浦尔”
console.log(getPropForState(“马哈拉施特拉邦”,“首都”);//返回“孟买”
console.log(getPropForState(“马哈拉施特拉邦”,“缺失”);//返回未定义的

console.log(getPropForState(“昆士兰”、“食品”);//返回未定义的
use
forEach
或simple
for
loop是否要查找一种食物,或者与食物列表完全匹配,或者如果数据中包含您传入的多个食物,则进行匹配?@torazaburo我想要食物数组,我的意思是食物列表这不是我要的。您正在指定一个函数
国家(州、食品)
。我想知道的是,如果您传递到
国家的食品与该州的食品完全匹配,或者如果它们包含在该州的食品中,函数是否应该返回州和食品,或者您是否真的希望传递一种食品并查找其食品包含该食品的州,连同它所有的食物一起?随机思考:如果它返回一个州和食物,为什么它被称为
country
?他要求一个
功能国家(州,食物)
。你会怎么写呢?你的函数没有使用
someCapital
,那你为什么要传入它呢?@torazaburo他告诉我写一个函数来检查状态和资本是否是对象的一部分,然后返回capital@torazaburo我更新了我的解决方案以使用一些资金。
function StateHasFood(state, food)
{
    for (var i in india)
        if (india[i].state == state)
            return india[i].foods.indexOf(food) >= 0;
    return false;
}
function StateHasFood(state, food)
{
    for (var i in india)
        if (india[i].state == state)
            if (india[i].foods.indexOf(food) >= 0)
                return india[i];
    return false;
}
var result = india.find( item => (item.state === this) , searchState);
console.log(result.foods);