[英]Count elements in a multidimensional array
Ive got this code: 我有这个代码:
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++
}}
It will take a JSON array that looks similar to the following 它将采用类似于以下内容的JSON数组
{"1":{"project":"RobinsonMurphy","task":"Changing blog templates","time":"18\/07\/11 04:32PM"},"2":{"project":"Charli...
The code should loop through the rows (which it does), and then loop through the colums of data. 代码应循环遍历行(它执行),然后循环遍历数据列。
The problem I am facing is in order to place the column data in the correct column, I need to calculate how many pieces of data are being returned in a row. 我面临的问题是为了将列数据放在正确的列中,我需要计算连续返回多少个数据。 I tried jsonArray[i].length, however this returns undefined.
我尝试过jsonArray [i] .length,但这会返回undefined。
Any help would be appreciated 任何帮助,将不胜感激
You do not have any arrays at all, only objects. 您根本没有任何数组,只有对象。
To count items in an object, create a simple function: 要计算对象中的项目,请创建一个简单的函数:
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;
}
Now, you can call countInObject(jsonArray[i])
. 现在,您可以调用
countInObject(jsonArray[i])
。
Like this: 像这样:
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);
I've been facing the same issue and I scripted a function that gets all the scalar values in a multidimensional Array/Object combined. 我一直面临着同样的问题,我编写了一个函数,它将多维数组/对象中的所有标量值组合在一起。 If the object or array are empty, then I assume that it's not a value so I don't sum them.
如果对象或数组是空的,那么我认为它不是一个值,所以我不总结它们。
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
Or if you want to use this in production, you could even think about adding it to the Object prototype, like this: 或者如果你想在生产中使用它,你甚至可以考虑将它添加到Object原型中,如下所示:
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
Have a look to that fiddle : http://jsfiddle.net/Christophe/QFHC8/ 看看那个小提琴: http : //jsfiddle.net/Christophe/QFHC8/
key is 关键是
for (var j in jsonArray[i]) {
instead of 代替
while (col <= jsonArray[i].length) {
jsonArray[i].length will not work because jsonArray[i] is a dictionary not an array. jsonArray [i] .length将无效,因为jsonArray [i]是字典而不是数组。 You should try something like:
你应该尝试类似的东西:
for(var key in jsonArray[i]) {
jsonArray[i][key]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.