【问题标题】:How to merge these arrays/json objects?如何合并这些数组/json 对象?
【发布时间】:2012-06-25 08:52:08
【问题描述】:

此时我对什么是对象、什么是数组以及什么是 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"]}} 

我该怎么做呢?谢谢

【问题讨论】:

标签: javascript jquery


【解决方案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 对象通知。你可能已经猜到了。一切都是一个对象......它也是一个{ }; 但它是不同的,因为 - 它用于将数据传输到 - 和 - 从 JavaScript,而不是实际使用(通常)in JavaScript。它是一种文件传输格式。

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

与前面示例的唯一区别是引号。本质上,我们将对象文字包装为字符串,以便可以将其传输到服务器或返回,并且可以很容易地重新解释它。比 XML 更好 - 因为它不必进行自定义解析。只需致电stringify()ParseJSON()。去谷歌上查询。重点是... JSON 可以转换为 object-literal JS 对象,JS object-literals 可以转换为 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 和 2,谢谢 :) 答案 3 不是我想要的。我想取两组数组并将它们放入数组中。所以它会是 [[array1],[array2]]
  • 太棒了。乐意效劳。感谢您的礼貌和澄清。答案 3:漂亮的多维数组 - 是一种强大的构造,并且易于使用。方法如下。
  • 非常感谢您的所有工作 :) 我从您的解释中学到了很多东西。在沿着这条路走得更远之后,我发现不幸的是,我试图做的事情是行不通的,哈哈。只好另辟蹊径。但我仍然非常感谢您的解释。
  • 谢谢。是的,这是 JS 编程理论,不是实践。我一次又一次地看到,最合适的胜出。在达到最佳状态之前,不可知论方法很重要,它需要遍历许多解决方案。一路学习是关键。乐意效劳。很高兴学习。
【解决方案2】:

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

【讨论】:

  • 输出不同于 OP 请求
【解决方案3】:

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

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;

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:
      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"];
      }
      

      【讨论】:

      • 当我尝试这样做时,我最终会从两个不同的 console.logs 中得到以下 {"public":{"0":["el29t7","3bmGDy"]}} "{\"public\":{\"0\":[\"el29t7\",\"3bmGDy\"]}}" (我修改了代码以使用您提供的内容)(这些值可以重复仅供参考)
      猜你喜欢
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2012-05-28
      相关资源
      最近更新 更多