【问题标题】:Is it possible to access a json array element without using index number?是否可以在不使用索引号的情况下访问 json 数组元素?
【发布时间】:2016-06-26 20:29:39
【问题描述】:

我有以下 JSON:

{
   "responseObject": {
   "name": "ObjectName",
   "fields": [
   {
     "fieldName": "refId",
     "value": "2170gga35511"
   },
   {
     "fieldName": "telNum",
     "value": "4541885881"
   }]}
}

我想在不使用索引号的情况下使用"fieldName": "telNum" 访问数组元素的"value",因为我不知道每次都确切地知道这个telNum 元素会出现在哪个位置。

我的梦想是这样的:

jsonVarName.responseObject.fields['fieldname'='telNum'].value

这在 JavaScript 中是否可行?

【问题讨论】:

标签: javascript arrays json


【解决方案1】:

你可以这样做

var k={
   "responseObject": {
   "name": "ObjectName",
   "fields": [
   {
     "fieldName": "refId",
     "value": "2170gga35511"
   },
   {
     "fieldName": "telNum",
     "value": "4541885881"
   }]
}};
value1=k.responseObject.fields.find(
function(i)
{return (i.fieldName=="telNum")}).value;
console.log(value1);

【讨论】:

  • 谢谢,我相信这是最接近的解决方案。
  • 确保不会破坏旧浏览器中的任何内容
  • @ArseniProkharchyk 感谢您的警告,但此代码仅用于演示,甚至没有适当的浏览器:)
【解决方案2】:

JSONPath 允许您编写查询,就像 XPATH 为 XML 所做的那样。

$.store.book[*].author  the authors of all books in the store
$..author               all authors
$.store.*               all things in store, which are some books and a red bicycle.
$.store..price          the price of everything in the store.
$..book[2]              the third book
$..book[(@.length-1)] 
$..book[-1:]            the last book in order.
$..book[0,1]
$..book[:2]             the first two books
$..book[?(@.isbn)]      filter all books with isbn number
$..book[?(@.price<10)]  filter all books cheapier than 10
$..*                    All members of JSON structure.

【讨论】:

  • 不得不承认,我不知道这个库。尽管它为您的代码增加了一种依赖性.. 如果您对此表示满意 - 就这样做!感谢您的库。
【解决方案3】:

你将不得不循环并找到它。

var json = {
   "responseObject": {
   "name": "ObjectName",
   "fields": [
   {
     "fieldName": "refId",
     "value": "2170gga35511"
   },
   {
     "fieldName": "telNum",
     "value": "4541885881"
   }]
};
  
function getValueForFieldName(fieldName){
  for(var i=0;i<json.fields.length;i++){
    if(json.fields[i].fieldName == fieldName){
      return json.fields[i].value;
    }
  }
  return false;
}

console.log(getValueForFieldName("telNum"));

【讨论】:

    【解决方案4】:

    将数组修改为以fieldName为键的对象可能是一个更好的选择,以避免一遍又一遍地使用.find

    fields = Object.assign({}, ...fields.map(field => {
        const newField = {};
        newField[field.fieldName] = field.value;
        return newField;
    }
    

    【讨论】:

      【解决方案5】:

      这是不可能的。原生 JavaScript 没有任何类似于 XPATH 的东西,比如在 xml 中遍历 JSON。您必须循环或使用Array.prototype.find(),如 cmets 中所述。 它是实验性的,仅支持 Chrome 45+、Safari 7.1+、FF 25+。没有 IE。

      例子可以在here找到

      【讨论】:

      • 您能否详细说明并举个小例子?
      • 你想让我写什么例子?不知道我明白你想看什么......循环? Array.prototype.find? xml XPATH?
      • 只需向 OP 展示如何使用 find 或替代方法,并提供一些关于对所述方法的支持的信息。
      • 不提供指向外部网站的链接作为答案,这些不被视为答案
      • 问题是“这在 JavaScript 中是否可行?”。我给出了我的答案。然后,人们要求举个例子。我提供了一个示例,但不是将其视为答案,而是帮助找到他们正在寻找的内容。
      【解决方案6】:

      循环遍历数组的简洁方法。

      var json = {
         "responseObject": {
         "name": "ObjectName",
         "fields": [
          {
           "fieldName": "refId",
           "value": "2170gga35511"
          },
        {
          "fieldName": "telNum",
          "value": "4541885881"
        }]
       }   
        $(json.responseObject.fields).each(function (i, field) {
          if (field.fieldName === "telNum") {
      
            return field.value // break each
          }
        })
      

      【讨论】:

      • 谢谢,但我正在寻找一个没有 jquery 的纯 javascript 解决方案。
      猜你喜欢
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      相关资源
      最近更新 更多