如何通过ID获取json数组中的数据

时间:2011-11-17 08:05:23

标签: javascript jquery html ajax json

我有问题,请你帮我! 我有一个json数组:

"category" : [
{
    id: 1,
    product: [{id : product_1, type : ball}] 
},
{
    id : 2,
    product :[{id : product_2, type : pen}]
}
]

我的问题是:如果我有一个链接,例如:http://test/category/1那么,我怎样才能按ID = 1的类别获取产品信息? 感谢您的任何建议:)

6 个答案:

答案 0 :(得分:9)

假设您的数据结构如下所示:

var data = {
    "category" : [
    {
        id: 1,
        product: [{id : product_1, type : ball}] 
    },
    {
        id : 2,
        product :[{id : product_2, type : pen}]
    }
    ]
}

然后,你可以通过搜索数组来找到id == 1的类别数组中的项目:

function findId(data, idToLookFor) {
    var categoryArray = data.category;
    for (var i = 0; i < categoryArray.length; i++) {
        if (categoryArray[i].id == idToLookFor) {
            return(categoryArray[i].product);
        }
    }
}

var item = findId(data, 1);
// item.id, item.type

答案 1 :(得分:6)

这是一种在一行中完成而不使用for:

的方法
function filterById(jsonObject, id) {return jsonObject.filter(function(jsonObject) {return (jsonObject['id'] == id);})[0];}

然后,如果你想获得id = 2的对象,你只需使用:

var selectedObject = filterById(yourJson['category'], 2);

然后,根据您的示例,selectedObject将获得此值:

{
    id : 2,
    product :[{id : product_2, type : pen}]
}

有一个缺点:旧的浏览器,如IE8,不支持filter(),所以你需要添加这个polyfill代码以获得旧的浏览器兼容性: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter#Polyfill

答案 2 :(得分:2)

如果在categories JS变量中保存类别数组,则可以基于简单的JavaScript(没有jQuery)过滤此数组:

var result = categories.filter(function(element){
    if (element.id == 2){
        return true;
    } else {
        return false;
    }
});

然后在result[0].product中,您将拥有特定类别的产品数组。

请参阅this jsfiddle以获取证明。

PS。 filter()方法并非在所有浏览器中都可用,您可能需要应用一些代码,以便在需要时找不到它们。以下是有关filter()详细信息以及使其适用于旧浏览器所需的代码的Mozilla开发人员网络上的一些文章:MDN: filter()

答案 3 :(得分:0)

我认为OP希望从网址中检索相应的数据。

所以第一步是将网址映射到标识符

var urlParts = window.location.href.split(/\//)
//window.location.href = http://domain.com/category/1
// urlParts = ['http:', '', 'domain.com', 'category', '1']
var id = urlParts.pop();
var category = urlParts.pop();

然后使用JSON.parse

从JSON字符串中检索数据
var data = JSON.parse('{"category" : [{"id": 1, "product": [{"id" : "product_1", "type" : "ball"}] }, {"id" : 2, "product" :[{"id" : "product_2", "type" : "pen"}] } ]}');

//The data structure
// {"category" : [
//   {"id": 1, "product" : 
//     [
//       {"id" : "product_1", "type" : "ball"}
//     ]},

//   {"id" : 2, "product" :
//     [
//       {"id" : "product_2", "type" : "pen"}
//     ]} 
// ]}

最后,您可以使用idcategory

来检索类似@jfriend00的帖子的数据
function findId(data, idToLookFor) {
    var categoryArray = data.category;
    for (var i = 0; i < categoryArray.length; i++) {
        if (categoryArray[i].id == idToLookFor) {
            return(categoryArray[i].product);
        }
    }
}

var item = findId(data.category, id);
// item.id, item.type

答案 4 :(得分:0)

您可能已找到答案,但如果还没有,则只需使用逻辑 OR ||)运算符。

在您的情况下,您可以使用jQuery的ajax()方法。要根据id获取您的产品,只需使用以下简单逻辑:

var prodID1 = 1, prodID2 = 2;
if(this.id == prodID || this.id == prodID2) {
  //write your JSON data, etc.
  //push to array, etc.
}

答案 5 :(得分:0)

我在获取JSON列表时添加了一个动态ID,并且此ID存储在本地存储中,然后在匹配本地存储ID和列表ID之后

解决方案:

editRec(row) {
  var NewMsg = JSON.parse(localStorage.getItem('id'));
  for (var i = 0; i < row.length; i++) {
    if (row[i].id == NewMsg) {
      let body = {
        msg: row[i].msg = this.SendMsg.value.msg,
      }
      row[i].msg = body.msg;
    }
  }
}