在javascript对象数组中查找元素的索引

在javascript对象数组中查找元素的索引,javascript,Javascript,我是javascript新手,希望在底部找到给定键值的索引,但无法这样做。我错在哪里?数组中的数据从一个json文件中复制,该文件在jsonlint上检查有效 var-productArray=[ { “名称1”:“电子设备”, “id1”:{ “产品1”:{ “id”:1.1, “名称”:“Microsoft键盘”, “说明”:“好的键盘”, “评级”:3, “价格”:500, “免费送货”:没错, “卖方”:“MS”, “quanAvl”:10 }, “产品2”:{ “id”:1.2, “

我是javascript新手,希望在底部找到给定键值的索引,但无法这样做。我错在哪里?数组中的数据从一个json文件中复制,该文件在jsonlint上检查有效

var-productArray=[
{
“名称1”:“电子设备”,
“id1”:{
“产品1”:{
“id”:1.1,
“名称”:“Microsoft键盘”,
“说明”:“好的键盘”,
“评级”:3,
“价格”:500,
“免费送货”:没错,
“卖方”:“MS”,
“quanAvl”:10
},
“产品2”:{
“id”:1.2,
“名称”:“华硕手机”,
“说明”:“好手机”,
“评级”:4,
“价格”:10000美元,
“免费送货”:没错,
“卖方”:“华硕”,
“quanAvl”:10
},
“产品3”:{
“id”:1.3,
“名称”:“iPhone”,
“说明”:“好手机”,
“评级”:3,
“价格”:50000美元,
“免费送货”:错误,
“卖方”:“苹果”,
“quanAvl”:100
}
},
“名称2”:“服装”,
“id2”:{
“产品4”:{
“id”:2.1,
“姓名”:“牛仔裤”,
“描述”:“好牛仔裤”,
“评级”:3,
“价格”:800美元,
“免费送货”:没错,
“卖方”:“Levis”,
“quanAvl”:100
},
“产品5”:{
“id”:2.2,
“姓名”:“T恤”,
“描述”:“好T恤”,
“评级”:4,
“价格”:1000美元,
“免费送货”:没错,
“卖方”:“彼得”,
“quanAvl”:1000
},
“产品6”:{
“id”:2.3,
“姓名”:“谢尔瓦尼”,
“描述”:“非常好”,
“评级”:4,
“价格”:50000美元,
“免费送货”:错误,
“卖方”:“Maanyavar”,
“quanAvl”:1000
}
}},
];
变量显示=函数(productArray、prodKey、value){
对于(productArray中的x)
{
if(productArray[x][prodKey]==值)
{
控制台日志(x);
}
否则{
警报(“未找到”);
}
}
}

显示(productArray、“名称”、“Sherwani”)您在示例中查找的名称更深一层。这应该起作用:

var display = function(productArray, prodKey, value){
    for (x in productArray) {
        for (prod in productArray[x]) {
            if (productArray[x][prod][prodKey] == value) {
                console.log(x);
            } else {
                alert("Not Found");
            }
        }
    }
}

您在示例中寻找的名称更深一层。这应该起作用:

var display = function(productArray, prodKey, value){
    for (x in productArray) {
        for (prod in productArray[x]) {
            if (productArray[x][prod][prodKey] == value) {
                console.log(x);
            } else {
                alert("Not Found");
            }
        }
    }
}

这就是答案。我试过这个

var display=function(productArray_,prodKey,value){      

    p = productArray_[0]["id2"];

    found = false;

    for (var key in p) {
      if (p.hasOwnProperty(key)) {
        p2 = p[key];
        for(var key2 in p2){
            if(p2.hasOwnProperty(key2)){
                if(key2 == prodKey && p2[key2] == value){
                    console.log(key2); //index of value you looking for
                    console.log(p2[key2]) //value from index you looking for

                    alert(key2);

                    found = true;
                }
            }
        }
      }
    }

    if(!found)
        alert("not found");
}

display(productArray,"name","Sherwani");
但我同意,这是一个非常糟糕的对象结构。您应该更改json结构,以便更轻松地解析它

更新:应该尽可能避免创建json对象(以“{”开头,以“}”结尾),而是创建json数组(以“[”开头,以“]”结尾)

下面是一个更好的结构以及如何解析它

var productArray=[
  {
    "name": "Electronics",
    "list": [
      {
        "code": "products1",
        "id": 1.1,
        "name": "Microsoft Keyboard",
        "description": "good keyboard",
        "rating": 3,
        "price": 500,
        "freeDeliv": true,
        "seller": "MS",
        "quanAvl": 10
      },
      {
        "code": "products2",
        "id": 1.2,
        "name": "ASUS phone",
        "description": "good phone",
        "rating": 4,
        "price": 10000,
        "freeDeliv": true,
        "seller": "ASUS",
        "quanAvl": 10
      },
      {
        "code": "products3",
        "id": 1.3,
        "name": "iPhone",
        "description": "good phone",
        "rating": 3,
        "price": 50000,
        "freeDeliv": false,
        "seller": "Apple",
        "quanAvl": 100
      }
    ]
  },
  {
    "name": "Clothing",
    "list": [
      {
        "code": "products4",
        "id": 2.1,
        "name": "Jeans",
        "description": "good Jeans",
        "rating": 3,
        "price": 800,
        "freeDeliv": true,
        "seller": "Levis",
        "quanAvl": 100
      },
      {
        "code": "products5",
        "id": 2.2,
        "name": "TShirt",
        "description": "good TShirt",
        "rating": 4,
        "price": 1000,
        "freeDeliv": true,
        "seller": "Peter",
        "quanAvl": 1000
      },
      {
        "code": "products6",
        "id": 2.3,
        "name": "Sherwani",
        "description": "very good",
        "rating": 4,
        "price": 50000,
        "freeDeliv": false,
        "seller": "Maanyavar",
        "quanAvl": 1000
      }
    ]
  },

]

var display=function(productArray_,prodKey,value){
    found = false;

    for(var key in productArray_){
        for(var key2 in productArray_[key]){
            if(key2 == "list"){                 
                for(var key3 in productArray_[key][key2]){
                    for(var key4 in productArray_[key][key2][key3]){
                        if(key4 == prodKey 
                            && productArray_[key][key2][key3][key4] == value
                            ){
                            console.log(key4);
                            console.log(productArray_[key][key2][key3][key4]);
                            alert(key4);

                            found = true;
                        }                           
                    }
                }
            }
        }
    }

    if(!found)
        alert("not found");     
}

display(productArray,"name","Sherwani");

这就是答案。我试过这个

var display=function(productArray_,prodKey,value){      

    p = productArray_[0]["id2"];

    found = false;

    for (var key in p) {
      if (p.hasOwnProperty(key)) {
        p2 = p[key];
        for(var key2 in p2){
            if(p2.hasOwnProperty(key2)){
                if(key2 == prodKey && p2[key2] == value){
                    console.log(key2); //index of value you looking for
                    console.log(p2[key2]) //value from index you looking for

                    alert(key2);

                    found = true;
                }
            }
        }
      }
    }

    if(!found)
        alert("not found");
}

display(productArray,"name","Sherwani");
但我同意,这是一个非常糟糕的对象结构。您应该更改json结构,以便更轻松地解析它

更新:应该尽可能避免创建json对象(以“{”开头,以“}”结尾),而是创建json数组(以“[”开头,以“]”结尾)

下面是一个更好的结构以及如何解析它

var productArray=[
  {
    "name": "Electronics",
    "list": [
      {
        "code": "products1",
        "id": 1.1,
        "name": "Microsoft Keyboard",
        "description": "good keyboard",
        "rating": 3,
        "price": 500,
        "freeDeliv": true,
        "seller": "MS",
        "quanAvl": 10
      },
      {
        "code": "products2",
        "id": 1.2,
        "name": "ASUS phone",
        "description": "good phone",
        "rating": 4,
        "price": 10000,
        "freeDeliv": true,
        "seller": "ASUS",
        "quanAvl": 10
      },
      {
        "code": "products3",
        "id": 1.3,
        "name": "iPhone",
        "description": "good phone",
        "rating": 3,
        "price": 50000,
        "freeDeliv": false,
        "seller": "Apple",
        "quanAvl": 100
      }
    ]
  },
  {
    "name": "Clothing",
    "list": [
      {
        "code": "products4",
        "id": 2.1,
        "name": "Jeans",
        "description": "good Jeans",
        "rating": 3,
        "price": 800,
        "freeDeliv": true,
        "seller": "Levis",
        "quanAvl": 100
      },
      {
        "code": "products5",
        "id": 2.2,
        "name": "TShirt",
        "description": "good TShirt",
        "rating": 4,
        "price": 1000,
        "freeDeliv": true,
        "seller": "Peter",
        "quanAvl": 1000
      },
      {
        "code": "products6",
        "id": 2.3,
        "name": "Sherwani",
        "description": "very good",
        "rating": 4,
        "price": 50000,
        "freeDeliv": false,
        "seller": "Maanyavar",
        "quanAvl": 1000
      }
    ]
  },

]

var display=function(productArray_,prodKey,value){
    found = false;

    for(var key in productArray_){
        for(var key2 in productArray_[key]){
            if(key2 == "list"){                 
                for(var key3 in productArray_[key][key2]){
                    for(var key4 in productArray_[key][key2][key3]){
                        if(key4 == prodKey 
                            && productArray_[key][key2][key3][key4] == value
                            ){
                            console.log(key4);
                            console.log(productArray_[key][key2][key3][key4]);
                            alert(key4);

                            found = true;
                        }                           
                    }
                }
            }
        }
    }

    if(!found)
        alert("not found");     
}

display(productArray,"name","Sherwani");

数据的嵌套比您的搜索更深。您正在查找
productArray[x].name='Sherwani'
,但该值位于
productArray[x].id2.products6.name
。请注意额外的深度。您的
productArray
对象看起来非常错误,请先了解什么是数组,以及如何在对象中表示它
productArray.length
1
对象。键(…)
将帮助您迭代对象。向上看数据嵌套比搜索更深。您正在查找
productArray[x].name='Sherwani'
,但该值位于
productArray[x].id2.products6.name
。请注意额外的深度。您的
productArray
对象看起来非常错误,请先了解什么是数组,以及如何在对象中表示它
productArray.length
1
对象。键(…)
将帮助您迭代对象。即使我同意这是一个糟糕的结构,但我没有主意了。这应该是一个简单的json结构的电子商务网站。我该怎么办?大约4小时后我会给你我的建议。我现在必须开始工作了,我只是在itWow中用json结构的建议更新了我的答案,很多是thnx。我很早就在JS中,所以这是救命的。嘿@Dika,每当我试图找到相同值的索引时,我得到-1。请帮帮我。尝试了映射,indexOf,但有点不对劲。即使我同意这是一个糟糕的结构,但我没有想法。这应该是一个简单的json结构的电子商务网站。我该怎么办?大约4小时后我会给你我的建议。我现在必须开始工作了,我只是在itWow中用json结构的建议更新了我的答案,很多是thnx。我很早就在JS中,所以这是救命的。嘿@Dika,每当我试图找到相同值的索引时,我得到-1。请帮帮我。尝试映射,indexOf,但出现问题。