如何合并这些数组/ json对象?

时间:2012-06-23 03:43:22

标签: javascript jquery

关于什么是对象,什么是数组,什么是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"]}} 

我怎么能这样做?感谢

5 个答案:

答案 0 :(得分:8)

优秀的两部分问题。总的来说,第二个问题是非平凡的,因为第一个问题很复杂。

问题1:

  

什么是对象,什么是数组,什么是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 Object Notiation。你可能已经猜到了。一切都是一个对象...它也是一个{ };但它有所不同,因为 - 它用于将数据传输到 - 和 - 从JavaScript传输,而不是实际使用(通常) JavaScript中。这是一种文件传输格式。

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

与前一个例子的唯一区别是引号。本质上,我们将对象文字包装为字符串,以便可以将其传输到服务器或返回,并且可以非常轻松地重新解释它。优于XML - 因为它不必自定义解析。只需致电stringify()ParseJSON()即可。谷歌一下。重点是......例如,可以将JSON转换为对象文字JS对象,并将JS对象文字转换为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:啊,是的......如何合并。

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

Here is the answer

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

//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是强大的东西,坚持下去;它变得很好。 :)

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

答案 1 :(得分: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

答案 2 :(得分: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;

答案 3 :(得分: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;
}

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

答案 4 :(得分:0)

  1. 数组是一种特殊的Javascript对象
  2. JSON是一种表示Javascript对象的方式(因此可以表示数组等)
  3. 对象更通用,可以是可以表示为JSON的简单对象,也可以包含函数和原型。
  4. 所以,这不是一个数组数组(您可以使用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"];
    }