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

How to merge these arrays/json objects?

本文关键字:数组 json 对象 何合并 合并      更新时间:2023-09-26

在这一点上,我对什么是对象,什么是数组以及什么是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"]}} 

我该怎么做呢? 谢谢

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

问题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];

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

什么是 JSON?

JSON 代表 JavaScript 对象通知。正如您可能已经猜到的那样。一切都是物体...这也是一种{ };但它是不同的,因为它用于将数据传输到 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:啊,是的...如何合并。

有严肃(非常多)方法可以合并两个数组。这取决于您的确切需求。排序、复制、串联...有几个。

这是答案!

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

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

希望有帮助,万事如意!Nash

在这种情况下,将 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

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

演示显示显示输出 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;

如果{"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;
}

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

  1. 数组是一种特殊的Javascript对象
  2. JSON是一种表示Javascript对象的方式(因此可以表示数组等)
  3. 对象要通用得多,可以是可以表示为 JSON 的简单对象,也可以包含函数和原型。

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

{"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"];
}