6

在这一点上,我对什么是对象、什么是数组以及什么是 JSON 有点困惑。有人可以解释两者之间的语法差异吗?以及如何向每个项目添加项目,如何合并每种类型,等等?我试图让这个函数从 JSON 对象(我认为)中获取新信息并将其与一些新信息合并。然后,此信息将传递给 PHP 脚本进行处理。

这是控制台输出:

{"public":{"0":["el29t7","3bmGDy"]}} 
{"public":"[object Object][object Object]"} 

这是我正在使用的 JS:

/* Helper function to clean up any current data we have stored */
function insertSerializedData(ids, type) {
    // Get anything in the current field
    current_data = $('#changes').val();
    if (!current_data) {
        var data = {};
        data[index++] = ids;
        var final_data = {};
        final_data[type] = data;
        $('#changes').val(JSON.stringify(final_data));
    } else {
        current_data = JSON.parse(current_data);
        var data = {};
        data[index++] = ids;
        // Does the index exist?
        if (type in current_data) {
            var temp_data = current_data[type];
            current_data[type] = temp_data + data;
        } else {
            current_data[type] = data;
        }
        //var extra_data = {};
        //extra_data[type] = data;
        //$.merge(current_data, extra_data);
        $('#changes').val(JSON.stringify(current_data));
    }
    console.log($('#changes').val());
}

这个想法是,如果密钥(公共的或其他任何密钥)尚不存在,则使其指向数组数组。如果确实存在,则需要将数组数组与新数组合并。例如:

如果我有

{"public":{"0":["el29t7","3bmGDy"]}}  

我想将它与

["aj19vA", "jO71Ba"] 

那么最终结果将是:

{"public":{"0":["el29t7","3bmGDy"], "1":["aj19vA", "jO71Ba"]}} 

我该怎么做呢?谢谢

4

5 回答 5

8

优秀的两部分问题。总体而言,由于第一个问题的复杂性,第二个问题并不重要。

问题一:

什么是对象,什么是数组,什么是 JSON。有人可以解释两者之间的语法差异吗?

问题2:

以及如何向每个项目添加项目,

问题 3:

如何合并每种类型,等等?

答案1:

这是一个常见的绊脚石,因为 JavaScript 比人们最初预期的更灵活。这是曲线。

在 JavaScript 中,一切都是对象。

所以这里是每个的代码:

//What is an object?
var obj = { };                

var obj2 = { member:"value", myFunction:function(){} }

上面是一个空对象。然后是另一个带有变量和函数的对象。它们被称为对象文字。

//What is an array 
var array1 = [ ] ;     

var array2 = [0,1,2,3,4];

上面是一个空数组。然后是另一个包含五个整数的数组。

这是引起混乱的曲线。

//Get elements from each of the prior examples.
var x = obj2["member"];
var y = array2[1];

什么???Object 和 Array 都使用括号访问值?这是因为两者都是对象。事实证明,这对于编写高级代码来说是一种很好的灵活性。数组是对象。

//什么是JSON?

JSON 代表 JavaScript 对象表示法。你可能已经猜到了。一切都是一个对象......它也是一个{ };但它是不同的,因为 - 它用于将数据传输到 - 和 - 从 JavaScript,而不是JavaScript 中实际使用(通常)。它是一种文件传输格式。

var JSONObject = {"member":"value"};

与前面示例的唯一区别是引号。本质上,我们将对象文字包装为字符串,以便可以将其传输到服务器或返回,并且可以很容易地重新解释它。比 XML 更好 - 因为它不必进行自定义解析。只需打电话,stringify()ParseJSON()。去谷歌上查询。重点是... JSON 可以转换为 object-literal JS 对象,而 JS object-literal 可以转换为 JSON,例如传输到服务器或 CouchDB 数据库。

对不起,切线。

答案 2:

如何为每个项目添加一个项目?这是曲线不再令人讨厌的地方,并且开始变得很棒!因为一切都是对象,所以一切都差不多。

//Add to an object
var obj {member1:"stringvalue"}
obj.member2 = "addme";    //That is it!

//Add to an array
var array1 [1,2,3,4,5];
array1[0] = "addme";

array[6] = null;

//We shouldn't mix strings, integers, and nulls in arrays, but this isn't a best-practice tutorial.

记住 JS 对象语法,你可能会开始看到一个全新的灵活的对象世界打开了。但这可能需要一点时间。

答案3:啊,是啊...如何合并。

有很多(非常多)方法可以合并两个数组。这完全取决于您需要什么。排序,复制,连接......有一些。

这是答案

更新:如何制作漂亮的多维数组。

//Multiple Dimension Array
var array1 = [1,2,3];
var array2 = [3,4];

var arraysinArray = [array1,array2]; //That is it!

这是曲线,这可能在一个对象中:

var obj{
   array1:[1,2,3],
   array2:[3,4]
}

JavaScript 是强大的东西,坚持下去;它变得很好。:)

希望对您有所帮助,一切顺利!纳什

于 2012-06-23T04:17:08.647 回答
1

在这种情况下,将 JavaScript 的对象字面量{}视为 PHP 的关联数组。

鉴于此,“数组数组”实际上看起来像这样(使用您上面想要的输出):

{public: [["el29t7","3bmGDy"], ["aj19vA", "jO71Ba"]]}

所以这里我们有一个对象字面量,它有一个名为“public”的属性,它的值是一个二维数组。

如果我们将上面的内容分配给一个变量,我们可以将push另一个数组放到“public”上,如下所示:

var current_data = {public: [["el29t7","3bmGDy"], ["aj19vA", "jO71Ba"]]};

// Using direct property access
current_data.public.push(["t9t9t9", "r4r4r4"]);

// Or using bracket notation
current_data["public"].push(["w2w2w2", "e0e0e0"]);

current_data的值现在是:

{public: [
  ["el29t7","3bmGDy"], 
  ["aj19vA", "jO71Ba"], 
  ["t9t9t9", "r4r4r4"], 
  ["w2w2w2", "e0e0e0"]
]}

所以现在“public”是一个长度为4的数组。

current_data.public[0]; // ["el29t7","3bmGDy"]
current_data.public[1]; // ["aj19vA", "jO71Ba"]
current_data.public[2]; // ["t9t9t9", "r4r4r4"]
current_data.public[3]; // ["w2w2w2", "e0e0e0"]

MDN 有非常好的关于 Array 的文档,可以帮助您深入了解您可能需要的其他功能。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array

于 2012-06-23T04:23:11.920 回答
0

第一个是一个对象,包含数组,第二个是一个数组。

DEMO 显示显示输出 http://jsfiddle.net/GjQCV/

var object={"public":{"0":["el29t7","3bmGDy"]}};
var arr=["aj19vA", "jO71Ba"] ;
/* use object notation to add new property and value which is the array*/
object.public[1]=arr;
于 2012-06-23T03:53:01.887 回答
0

{"0": ...}如果是一个真正的数组而不是一个对象,那会更自然,但无论如何:

function maxKey(b) {
    var max;
    for( var key in b )
        var max = key;
    return max;
}
function merge(a,b) {
    for( var key in a ) {
        b[key] = b[key] ? (b[key][maxKey(b)+1]=a[key], b[key]) : a[key];
    }
    return b;
}

请注意,这假设您将在下一个整数索引处插入

于 2012-06-23T03:53:15.580 回答
0
  1. 数组是一种特殊的 Javascript 对象
  2. JSON 是一种表示 Javascript 对象的方式(因此可以表示数组等)
  3. 对象更为通用,可以是可以表示为 JSON 的简单对象,也可以包含函数和原型。

因此,这不是数组数组(您可以使用 JSON 表示法访问项目,例如myobj["0"]):

{"0":["el29t7","3bmGDy"], "1":["aj19vA", "jO71Ba"]}

这是一个数组数组,这意味着您可以使用push方法添加一个项目,并使用诸如myobj[0]之类的数组表示法访问项目:

[ ["el29t7","3bmGDy"], ["aj19vA", "jO71Ba"] ]

看起来你想要的结构是这样的:

var myobj = { "public": [ ["key", "value"], ["key", "value"] ] }

然后,如果你想添加/合并新项目,你会这样写:

if (myobj["public"] != null) {
    myobj["public"].push(["newkey", "newval"]);
} else {
    myobj["public"] = ["newkey", "newval"];
}
于 2012-06-23T03:54:48.737 回答