【问题标题】:make an array with the values of similar keys from JSON array使用 JSON 数组中相似键的值创建一个数组
【发布时间】:2017-12-27 07:39:56
【问题描述】:

我有一个 JSON 数组格式的数组。我想提取公共键的值并用它创建一个新数组。 这个我试过了

var date = [];
var amt = [];
for(var i in data){
    date.push(data[i].sale_date);
    amt.push(data[i].total);
}

其中sale_datetotal 是键。 但是这段代码返回了一个未定义对象的数组。 我的数组名为data 看起来像

{"sale_date":"2017-12-26 11:05:05","total":"500"}{"sale_date":"2017-12-26 11:05:18","total":"500"}

我期待两个数组 date[2017-12-26 11:05:05, 2017-12-26 11:05:18 ]amt[500, 500] 我从下面的代码中得到data 作为ajax 响应。

$sql = "SELECT sale_date, total FROM customers";
        $result = $conn->query($sql);
        if($result->num_rows>0){ 
            while($row=$result->fetch_assoc()){
                $db_data = $row;
                print json_encode($db_data);
            }
        }

这就是我的 ajax 请求的样子

$(document).ready(function(){
    $.post("ajax-req-handler.php",
    {
        key: "draw-line-chart"
    },
    function( data ){
        console.log(data);
        var date = [];
        var amt = [];
        for(var i in data){
            date.push(data[i].sale_date);
            amt.push(data[i].total);
        }
        console.log(date);
        console.log(amt);
     });
});

【问题讨论】:

  • 我认为您的代码没有任何问题。
  • 你遇到了什么问题?

标签: javascript jquery arrays json ajax


【解决方案1】:

var data = [
{"sale_date":"2017-12-26 11:05:05","total":"500"},{"sale_date":"2017-12-26 11:05:18","total":"500"}
];

var date = [];
var amt = [];
for(var i in data){
    console.log(i);
    date.push(data[i].sale_date);
    amt.push(data[i].total);
}

console.log(date);
console.log(amt);

PHP 代码:-

    $sql = "SELECT sale_date, total FROM customers";
        $result = $conn->query($sql);
        $data = array();
        if($result->num_rows>0){ 
            while($row=$result->fetch_assoc()){
                $db_data[] = $row;
            }
        }
   echo json_encode($db_data);

Ajax 请求:-

$(document).ready(function(){
$.post("ajax-req-handler.php",
{
    key: "draw-line-chart"
},
function( data ){
    console.log(data);
    data = JSON.parse(data);
    var date = [];
    var amt = [];
    for(var i in data){
        date.push(data[i].sale_date);
        amt.push(data[i].total);
    }
    console.log(date);
    console.log(amt);
 });

});

【讨论】:

  • 这正是我所做的,但唯一不同的是,我不是定义数组,即数据,而是通过 ajax 响应获取它
  • @Waeez 您需要更改您的 php 代码。问题出在您的 PHP 代码上。
  • 哦。谢谢,我已经修复了我的 PHP 代码,但仍然得到未定义对象的数组
  • @Waeez 查看更新的 ajax 请求代码。您需要将字符串格式的数据解析为javascript数组。
  • 将您的查询更改为 SELECT DATE(sale_date) AS sale_date, SUM(total) AS total FROM customers GROUP BY DATE(sale_date)
【解决方案2】:

你需要在数组之间封装你的对象

var data = [{"sale_date":"2017-12-26 11:05:05","total":"500"},{"sale_date":"2017-12-26 11:05:18","total":"500"}]
var date = [];
var amt = [];

for(var i=0;i<data.length;i++){
    date.push(data[i].sale_date);
    amt.push(data[i].total);
}
console.log(date);
console.log(amt);

【讨论】:

  • 这正是我所做的,但唯一不同的是,我没有定义数组,即 data,而是通过 ajax 响应得到它
  • 您的响应中有多个对象。因此您需要将数据封装在数组中并使其成为数组对象。请检查您的回复
【解决方案3】:

这不是 JavaScript 而是 PHP 问题....您发送的 JSON 无效。以下:

{"sale_date":"2017-12-26 11:05:05","total":"500"}{"sale_date":"2017-12-26 11:05:18","total":"500"}

实际上应该是这样的:

[{"sale_date":"2017-12-26 11:05:05","total":"500"},{"sale_date":"2017-12-26 11:05:18","total":"500"}]

您需要将您的 PHP 代码更改为:

// Add content type so that jQuery knows you're sending JSON
header("Content-Type: application/json");
$sql = "SELECT sale_date, total FROM customers";
$result = $conn->query($sql);
$db_data = array();
while ($row = $result->fetch_assoc()) {
    $db_data[] = $row;
}
echo json_encode($db_data);

发送 Content-Type 标头就足够了,但您还应该更改 jQuery 代码以确保:

$(document).ready(function() {
    $.post("ajax-req-handler.php", {
        key: "draw-line-chart"
    }, function(data) {
        console.log(data);
        var date = [];
        var amt = [];
        for (var i in data) {
            date.push(data[i].sale_date);
            amt.push(data[i].total);
        }
        console.log(date);
        console.log(amt);
    }, "json");
    // the 4th parameter is dataType set to json
});

【讨论】:

  • 哦。谢谢,我已经修复了我的 PHP 代码,但 dateamt 仍然是未定义对象的数组
  • 发布您将 JSON 分配给 data 的代码(AJAX 代码)。
  • @Waeez 修改后的答案。
【解决方案4】:

//希望对您有所帮助。

var data = [ {"sale_date":"2017-12-26 11:05:05","total":"500"},{"sale_date":"2017-12-26 11:05:18","total":"500"} ];

var date = amt = [];

X = 0;

while (x < data.length) {
date.push(data[x].sale_date);
amt.push(data[x].total);
x++;
};

console.log(date);
console.log(amt);

说明:

第 1 行是代表你从你的 json 数据中提取的数据的对象数组。

第 2 行是分配给空数组的两个变量数组的声明。因此,我使用了在同一行语句中声明多变量的简写形式。

第 3 行是计数器“x”的初始化,一旦计数到数组“data”中的最后一个对象,它将有助于打破 While 循环。

第 4 行。然后是不断迭代数组“数据”的 While 循环。那里的条件语句总是检查计数器“x”是否

第 5 行。在 While 循环块代码中,使用计数器“x”作为数组的索引来访问该数组索引中对象的属性“sale_date”并将其推送到数组“date”(即添加它在数组“日期”的末尾)。

第 6 行。与第 5 行相同,访问数组“data”的索引中的属性 total 并将其推送到数组“amt”。

第 7 行将计数器“x”加 1,并将其分配回用于重新计算 While 循环的 x。

第 8 行和第 9 行只是一个控制台日志,分别显示 date 和 amt 中的内容。

谢谢

希望这对您有意义...请让我知道您的反馈。

【讨论】:

  • 你能添加一些文档/解释吗?
  • OK.. 很快
猜你喜欢
  • 2019-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2018-04-19
  • 2020-12-14
  • 2015-06-29
  • 2018-04-17
相关资源
最近更新 更多