如何检查JSON数组是否等于

时间:2021-11-11 21:43:53

I am creating pie charts with JSON and Flot. The JS function to create the pie chart receives a JSON array from Django in this format:

我正在用JSON和Flot创建饼图。创建饼状图的JS函数从Django接收到一个JSON数组,格式为:

[1, 3, 2, 5, 4]

If there is no data, the JSON array is:

如果没有数据,JSON数组为:

[0, 0, 0, 0, 0]

I'm trying to adjust the function so that if there is no data, then the pie will not be plotted and some text will appear instead (e.g. "Nothing to show yet"). So far I have tried:

我正在调整函数,以便如果没有数据,那么饼图将不会被绘制,一些文本将会出现。“还没有显示”)。到目前为止,我尝试过:

function loadWeekChart(theData) {
    var blankData = [0, 0, 0, 0, 0];
    if ($.data(theData) == $.data(blankData)){
    $('#week-pie-chart').empty().append('Nothing to show yet');
    } else {
        $.plot($("#week-pie-chart"), theData ,
            {
                series: {
                    pie: { 
                        show: true
                    }
                }
            });
     }
}

The JS doesn't fail, but it neither prints a pie chart (there is no data) nor does it give me the text replacement.

JS没有失败,但是它既没有打印饼图(没有数据),也没有给我文本替换。

Please can someone show me where I'm going wrong!

谁能告诉我哪里出错了?

5 个解决方案

#1


2  

Personaly i would do the following heres the psuedo code...

就我个人而言,我将做以下的psuedo代码……

set boolean to true
for each element in the JSON
    compare it with blank data element 
    if they are not equal boolean false
    else continue
return boolean

Then you will know if there same as that function returns true if they are false if they aren't.

然后你就会知道如果它们是假的如果它们是假的如果它们是假的。

Please let me know if you need help coding this. Shouldn't that hard

如果您需要帮助编码,请告诉我。不应该那么难

This may also help: Similar Question

这或许也有帮助:类似的问题

function checkJsons(otherJson,newJson)
{
    var sameJson = true;
     for (var key in otherJson) {
        if(otherJson[key] != newJson[key]) {sameJson=false;} return sameJson;
     }
}

That should help, not test though

这应该有帮助,而不是测试

A nicer way to do this but harder to read is

一种更好的阅读方式是

function checkJsons(otherJson,newJson)
{
  for (var key in otherJson) {if(otherJson[key] != newJson[key]) {return false;}}
  return true;
}

function pieChartData(theData)
{
  var blankData = [0, 0, 0, 0, 0];
 if(checkJsons(blankData,theData)){$('#week-pie-chart').empty().append('Nothing to show yet');} else { // do your code here // }
} 

#2


1  

I should think something like this should work:

我应该这样想:

var replace = true;
for(var i = 0; i < theData.length; i++)
{
    if(theData.[i] != 0)
    {
        replace = false;
        break;
    }
}

if(replace)
{
     $('#week-pie-chart').empty().append('Nothing to show yet');
}

else
{
    $.plot($("#week-pie-chart"), theData ,
        {
            series: {
                pie: { 
                    show: true
                }
            }
        });
}

#3


1  

how about use JSON.stringify?

使用JSON.stringify怎么样?

l1 = [0, 0, 0, 0];
l2 = [0, 0, 0, 1];
var bEqual = JSON.stringify(l1) == JSON.stringify(l2);
console.log(bEqual);

#4


0  

You don't need to compare with 0-filled array. Just check the input array is 0-filled. I think reduce() is the best for this:

不需要与0填充的数组进行比较。只需检查输入数组是否为0。我认为reduce()是最好的方法:

if(arr.reduce(function(a, b){ return a + b; }) == 0) {
    //Nothing to show
} else {
    ...

...but older browsers don't support reduce(), so I suggest using $.grep() instead (because you're already using jQuery).

…但是旧的浏览器不支持reduce(),所以我建议使用$.grep()(因为您已经在使用jQuery)。

if($.grep(theData, function (a) { return a != 0; }).length == 0) {
    //Nothing to show
} else {
    ...

#5


0  

LmC's answer is good for comparing to JSON objects. I adapted it to compare two JSON arrays which can even have nested JSON arrays. Here is the code:

LmC的答案很适合与JSON对象进行比较。我对它进行了调整,以比较两个甚至可以嵌套JSON数组的JSON数组。这是代码:

var areJSONArraysEqual = function(jsonArray1,
                                    jsonArray2) {

                                if(jsonArray1.length===0||jsonArray2.length===0){
                                    if(jsonArray1.length===0 && jsonArray2.length===0){
                                        return true;
                                    }else{
                                        return false;
                                    }
                                }

                                for(var i=0;i<jsonArray1.length;i++){
                                    for ( var key in jsonArray1[i]) {
                                        if(jsonArray1[i][key].length>1){
                                            return areJSONArraysEqual(jsonArray1[i][key],jsonArray2[i][key])
                                        }
                                        if (jsonArray1[i][key] != jsonArray2[i][key]) {
                                            return false;
                                        }
                                    }
                                }
                                return true;
                            };

#1


2  

Personaly i would do the following heres the psuedo code...

就我个人而言,我将做以下的psuedo代码……

set boolean to true
for each element in the JSON
    compare it with blank data element 
    if they are not equal boolean false
    else continue
return boolean

Then you will know if there same as that function returns true if they are false if they aren't.

然后你就会知道如果它们是假的如果它们是假的如果它们是假的。

Please let me know if you need help coding this. Shouldn't that hard

如果您需要帮助编码,请告诉我。不应该那么难

This may also help: Similar Question

这或许也有帮助:类似的问题

function checkJsons(otherJson,newJson)
{
    var sameJson = true;
     for (var key in otherJson) {
        if(otherJson[key] != newJson[key]) {sameJson=false;} return sameJson;
     }
}

That should help, not test though

这应该有帮助,而不是测试

A nicer way to do this but harder to read is

一种更好的阅读方式是

function checkJsons(otherJson,newJson)
{
  for (var key in otherJson) {if(otherJson[key] != newJson[key]) {return false;}}
  return true;
}

function pieChartData(theData)
{
  var blankData = [0, 0, 0, 0, 0];
 if(checkJsons(blankData,theData)){$('#week-pie-chart').empty().append('Nothing to show yet');} else { // do your code here // }
} 

#2


1  

I should think something like this should work:

我应该这样想:

var replace = true;
for(var i = 0; i < theData.length; i++)
{
    if(theData.[i] != 0)
    {
        replace = false;
        break;
    }
}

if(replace)
{
     $('#week-pie-chart').empty().append('Nothing to show yet');
}

else
{
    $.plot($("#week-pie-chart"), theData ,
        {
            series: {
                pie: { 
                    show: true
                }
            }
        });
}

#3


1  

how about use JSON.stringify?

使用JSON.stringify怎么样?

l1 = [0, 0, 0, 0];
l2 = [0, 0, 0, 1];
var bEqual = JSON.stringify(l1) == JSON.stringify(l2);
console.log(bEqual);

#4


0  

You don't need to compare with 0-filled array. Just check the input array is 0-filled. I think reduce() is the best for this:

不需要与0填充的数组进行比较。只需检查输入数组是否为0。我认为reduce()是最好的方法:

if(arr.reduce(function(a, b){ return a + b; }) == 0) {
    //Nothing to show
} else {
    ...

...but older browsers don't support reduce(), so I suggest using $.grep() instead (because you're already using jQuery).

…但是旧的浏览器不支持reduce(),所以我建议使用$.grep()(因为您已经在使用jQuery)。

if($.grep(theData, function (a) { return a != 0; }).length == 0) {
    //Nothing to show
} else {
    ...

#5


0  

LmC's answer is good for comparing to JSON objects. I adapted it to compare two JSON arrays which can even have nested JSON arrays. Here is the code:

LmC的答案很适合与JSON对象进行比较。我对它进行了调整,以比较两个甚至可以嵌套JSON数组的JSON数组。这是代码:

var areJSONArraysEqual = function(jsonArray1,
                                    jsonArray2) {

                                if(jsonArray1.length===0||jsonArray2.length===0){
                                    if(jsonArray1.length===0 && jsonArray2.length===0){
                                        return true;
                                    }else{
                                        return false;
                                    }
                                }

                                for(var i=0;i<jsonArray1.length;i++){
                                    for ( var key in jsonArray1[i]) {
                                        if(jsonArray1[i][key].length>1){
                                            return areJSONArraysEqual(jsonArray1[i][key],jsonArray2[i][key])
                                        }
                                        if (jsonArray1[i][key] != jsonArray2[i][key]) {
                                            return false;
                                        }
                                    }
                                }
                                return true;
                            };