Подсчет элементов в многомерном массиве - PullRequest
4 голосов
/ 26 июля 2011

Я получил этот код:

loadData : function(jsonArray) {
var id = $(this).attr("id");

for(var i in jsonArray) {
    $("#"+id+" tbody").append('<tr class="entry-details page-1 entry-visible" id="entry-'+i+'"></tr>');

    var header = {
        1: "time",
        2: "project",
        3: "task"
    }
    var col = 1;
    while(col <= jsonArray[i].length) {
        $("#"+id+" tbody #entry-"+i).append("<td>"+jsonArray[i][header[col]]+"</td>")
        col++
}}

Для этого потребуется массив JSON, который выглядит примерно так:

{"1":{"project":"RobinsonMurphy","task":"Changing blog templates","time":"18\/07\/11 04:32PM"},"2":{"project":"Charli...

Код должен циклически проходить по строкам (что он делает), а затем циклически проходить по столбцам данных.

Проблема, с которой я сталкиваюсь, состоит в том, чтобы поместить данные столбца в правильный столбец, мне нужно вычислить, сколько частей данных возвращается в строке. Я попытался jsonArray [i] .length, однако это возвращает неопределенный.

Любая помощь будет оценена

Ответы [ 5 ]

4 голосов
/ 26 июля 2011

У вас вообще нет массивов, только объекты.

Для подсчета предметов в объекте создайте простую функцию:

function countInObject(obj) {
    var count = 0;
    // iterate over properties, increment if a non-prototype property
    for(var key in obj) if(obj.hasOwnProperty(key)) count++;
    return count;
}

Теперь вы можете позвонить countInObject(jsonArray[i]).

2 голосов
/ 26 июля 2011

Как это:

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myArray);

Длина объекта JavaScript

0 голосов
/ 07 июня 2018

Я столкнулся с той же проблемой, и я написал сценарий для функции, которая объединяет все скалярные значения в многомерном массиве / объекте.Если объект или массив пусты, то я предполагаю, что это не значение, поэтому я не суммирую их.

function countElements(obj) {
  function sumSubelements(subObj, counter = 0) {
    if (typeof subObj !== 'object') return 1; // in case we just sent a value
    const ernation = Object.values(subObj);
    for (const ipated of ernation) {
      if (typeof ipated !== 'object') {
        counter++;
        continue;
      }
      counter += sumSubelements(ipated);
    }
    return counter;
  }
  return sumSubelements(obj);
}

let meBe = { a: [1, 2, 3, [[[{}]]]], b: [4, 5, { c: 6, d: 7, e: [8, 9] }, 10, 11], f: [12, 13], g: [] };
const itution = countElements(meBe);
console.log(itution); // 13

let tuce = [1,2];
console.log(countElements(tuce)); // 2

console.log(countElements(42)); // 1

Или, если вы хотите использовать это в производстве, вы можете даже подумать о добавлении егок прототипу объекта, например:

Object.defineProperty(Object.prototype, 'countElements', {
  value: function () {
    function sumSubelements(subObj, counter = 0) {
      const subArray = Object.values(subObj);
      for (const val of subArray) {
        if (typeof val !== 'object') {
          counter++;
          continue;
        }
        counter += sumSubelements(val);
      }
      return counter;
    }
    return sumSubelements(this);
  },
  writable: true,
});

console.log(meBe.countElements()); // 13
console.log([meBe].countElements()); // 13; it also works with Arrays, as they are objects
0 голосов
/ 26 июля 2011

jsonArray [i] .length не будет работать, поскольку jsonArray [i] - это словарь, а не массивВы должны попробовать что-то вроде:

for(var key in jsonArray[i]) {
     jsonArray[i][key]
}
0 голосов
/ 26 июля 2011

Посмотрите на эту скрипку: http://jsfiddle.net/Christophe/QFHC8/

ключ

for (var j in jsonArray[i]) {

вместо

while (col <= jsonArray[i].length) {
...