如何获取根json元素中的元素数量

时间:2016-05-11 12:06:40

标签: javascript json

我正在尝试获取Json的每个节点中的元素数量。 例如,在这种情况下:

{
  "tickets": {
    "use": "Valida",
    "useagain": "Valida di nuovo",
    "usetitle": "Convalida biglietto",
    "price": "Prezzo"
  },
  "fares": {
    "nofarestopurchase": "Non è possibile acquistare biglietti per la tratta indicata",
    "purchasedcongratulations": "Congratulazioni",
    "farepurchased": "Hai acquistato il tuo biglietto. Lo puoi trovare nella sezione",
    "mytickets": "I miei biglietti",
    "fareguestcard": "Hai ottenuto il tuo biglietto. Lo puoi trovare nella sezione"
  },
  "quantity": {
    "title": "Seleziona il numero di persone:"
  }
}
  

票证包含4种声音,包含4种票价和数量1。

如何以动态方式获取javascript中节点及其中元素的数量?

5 个答案:

答案 0 :(得分:2)

试试这种方式

Object.keys( obj ).forEach( function(key){
  console.log( "It has " + Object.keys(obj[key]).length + " " + key );
});

其中obj是对象变量名。

答案 1 :(得分:1)

现代浏览器有一个可以帮助你的Objects.keys,通常它会像这样使用:

Object.keys(jsonArray).length;

答案 2 :(得分:1)

您可以在对象上使用Object.keys()来获取其键的数组;然后,使用数组的length属性来查找数组中的键数。

因此,如果您的JSON结构是yourJSON,则可以执行以下操作:

var ticketsNum  = Object.keys(yourJSON.tickets).length; // 4
var faresNum    = Object.keys(yourJSON.fares).length; // 4
var quantityNum = Object.keys(yourJSON.quantity).length; // 1

对于嵌套数据,就像你在这里一样,你可以轻松编写一个函数来计算每个“顶级”键的键/值对:

function countKeys (obj) {
    var count = {};
    Object.keys(obj).forEach(function (key) {
        count[key] = Object.keys(obj[key]).length;
    });
    return count;
}

var nums = countKeys(yourJSON);
// nums = { tickets: 4, fares: 4, quantity: 1 }

答案 3 :(得分:0)

也许是这样的:

var ticket =  {
     "tickets": 
     {
        "use": "Valida",
        "useagain": "Valida di nuovo",
        "usetitle": "Convalida biglietto",
        "price": "Prezzo"
     },
     "fares": 
     {
        "nofarestopurchase": "Non è possibile acquistare biglietti per la tratta indicata",
        "purchasedcongratulations": "Congratulazioni",
        "farepurchased": "Hai acquistato il tuo biglietto. Lo puoi trovare nella sezione",
        "mytickets": "I miei biglietti",
        "fareguestcard": "Hai ottenuto il tuo biglietto. Lo puoi trovare nella sezione"
     },
     "quantity": 
     {
        "title": "Seleziona il numero di persone:"
     }
}

var result = {};

for(prop in ticket) { 
   if(ticket.hasOwnProperty(prop)) {
      result[prop] = { length: Object.keys(ticket[prop]).length };
   }
}

console.log(JSON.stringify(result)); // {"tickets":{"length":4},"fares":{"length":5},"quantity":{"length":1}}

答案 4 :(得分:0)

你可以尝试递归。是的,这有点慢,但可以扩展。

出于演示目的,我更新了json以显示嵌套对象。

JSFiddle

var data = {
  "tickets": {
    "use": "Valida",
    "useagain": "Valida di nuovo",
    "usetitle": "Convalida biglietto",
    "price": "Prezzo"
  },
  "fares": {
    "nofarestopurchase": "Non è possibile acquistare biglietti per la tratta indicata",
    "purchasedcongratulations": "Congratulazioni",
    "farepurchased": "Hai acquistato il tuo biglietto. Lo puoi trovare nella sezione",
    "mytickets": "I miei biglietti",
    "fareguestcard": "Hai ottenuto il tuo biglietto. Lo puoi trovare nella sezione"
  },
  "quantity": {
    "title": "Seleziona il numero di persone:"
  },
  "test": [1, 2, 3, 4, 5],
  "test2": {
    "foo": {
      "a": 1,
      "b": 2
    }
  }
}

function getCount(obj, result) {
  if (typeof(obj) === "object" || Array.isArray(obj)) {
    Object.keys(obj).forEach(function(_key) {
      return (function(key) {
        if (typeof(obj[key]) === "object" || Array.isArray(obj[key])) {
          result = result || {};
          result[key] = {};
          result[key].count = Object.keys(obj[key]).length;
          Object.keys(obj[key]).forEach(function(k) {
            getCount(obj[key], result[key]);
          });
        }
      })(_key)
    });
  }
}

var r = {};
getCount(data, r);
console.log(r);