2012-06-23 26 views
6

Estoy un poco confundido en este momento sobre qué es un objeto, qué es una matriz y qué es una JSON. ¿Alguien puede explicar las diferencias en sintaxis entre los dos? y cómo agregar elementos a cada uno, cómo fusionar cada tipo, y tal? Estoy intentando que esta función tome la información nueva de un objeto JSON (creo) y la combine con información nueva. Esta información se pasará a un script PHP para ser procesada.¿Cómo combinar estos arreglos/objetos json?

Aquí está la salida de la consola:

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

Aquí está la JS que estoy usando:

/* 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()); 
} 

La idea es que si la clave (público, o lo que otros) no existe sin embargo, para hacer que apunte a una matriz de matrices. Sin embargo, si existe, entonces la matriz de matrices debe fusionarse con una nueva matriz. Por ejemplo:

Si tengo

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

y quiero fusionarlo con

["aj19vA", "jO71Ba"] 

continuación, el resultado final sería:

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

¿Cómo puedo ir haciendo ¿esta? Gracias

+1

http://stackoverflow.com/questions/7232328/merge-json-object-arrays-and-sort-with-javascript podría ayudar –

Respuesta

8

Excelente pregunta de dos partes . En general, la segunda pregunta no es trivial debido a la complejidad de la primera.

Pregunta 1:

lo que es un objeto, lo que es una matriz, y lo que es un JSON. ¿Puede alguien explicar las diferencias en la sintaxis entre los dos?

Pregunta 2:

y cómo agregar elementos a cada uno,

Pregunta 3:

cómo combinar cada tipo, y tal?

Respuesta 1:

Este es un punto de tropiezo común, porque, JavaScript es más flexible de lo que cabría esperar inicialmente. Aquí está la curva.

En JavaScript todo es un objeto.

Así que aquí es el código para cada uno:

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

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

Por encima es un objeto vacío. Luego otro objeto con una variable y una función. Se llaman literales de objeto.

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

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

Above es una matriz vacía. Luego otra matriz con cinco enteros.

Aquí está la curva que causa confusión.

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

¿Qué ??? ¿Tanto el objeto como la matriz están accediendo a los valores con un corchete? Esto se debe a que ambos son objetos.Esto resulta ser una buena flexibilidad para escribir código avanzado. Las matrices son objetos.

// ¿Qué es JSON?

JSON significa JavaScript Object Notiation. Como habrás adivinado Todo es un objeto ... También es un { }; Pero es diferente porque - se usa para transferir datos a - y - desde JavaScript, no realmente usado (comúnmente) en JavaScript. Es un formato de transferencia de archivos.

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

La única diferencia con el ejemplo anterior son las comillas. Básicamente estamos envolviendo el objeto literal como una cadena para que pueda ser transferido a un servidor, o viceversa, y pueda ser reinterpretado, muy fácilmente. Mejor que XML, porque no tiene que ser analizado a medida. Simplemente llame al stringify() o al ParseJSON(). Buscalo en Google. El punto es ... JSON se puede convertir en un objeto JS object-literal, y los literales de objetos JS se pueden convertir en JSON, para transferirlos a un servidor o una base de datos CouchDB, por ejemplo.

Perdón por la tangente.

Respuesta 2:

cómo añadir un elemento para cada uno? ¡Aquí es donde la curva deja de ser una molestia y comienza a ser increíble! Como todo es un objeto, es casi lo mismo.

//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. 

recordar la sintaxis objeto JS y usted puede comenzar a ver un nuevo mundo entero de objetos flexibles abren. Pero puede tomar un poco.

Respuesta 3: Ah, sí ... cómo fusionar.

Hay muchas (muchas) maneras de combinar dos matrices. Depende de exactamente lo que necesitas. Ordenado, Duplicado, Concatenado ... hay algunos.

Here is the answer!

ACTUALIZACIÓN: Cómo hacer una hermosa matriz multidimensional.

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

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

Aquí es la curva de nuevo, esto podría ser en un objeto:

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

JavaScript es algo muy poderoso, palo con ella; se pone bien. :)

Espero que ayude, Todo lo mejor! Nash

+0

Realmente aprecio la respuesta 1 y 2, gracias :) Answer 3 no es lo que estoy buscando sin embargo. Quiero tomar los dos conjuntos de matrices y ponerlos en una matriz. Entonces sería [[matriz1], [matriz2]] – MasterGberry

+0

Genial. Feliz de ayudar. Gracias por su cortesía y aclaración. Respuesta 3: Una hermosa matriz multidimensional: es una construcción poderosa y puede ser fácil trabajar con ella. Aquí es cómo. –

+0

Editar en la parte inferior ... –

0

Primero es un objeto, que contiene una matriz, la segunda es una matriz.

DEMO producto, mostrando la pantalla 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

Sería mucho más natural si {"0": ...} eran un verdadero arsenal en lugar de un objeto, pero de todos modos:

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; 
} 

Tenga en cuenta que esto supone que lo haría insertar en el siguiente índice entero

0
  1. Las matrices son un tipo particular de JavaScript object
  2. JSON es una forma de representar objetos JavaScript (y como tal puede representar matrices y más)
  3. Los objetos son mucho más generales, y pueden ser objetos simples que pueden representarse como JSON o pueden contener funciones y prototipos .

Por lo tanto, esto no es una matriz de matrices (que accedería a elementos usando la notación JSON como myObj [ "0"]):

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

Ésta es una matriz de matrices, lo que significa se puede utilizar el método push para agregar un elemento y elementos de acceso usando notación de matriz como myObj [0]:

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

Parece que la estructura que desea es algo como esto:

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

Entonces, si desea agregar/fusionar elementos nuevos, que iba a escribir esto:

if (myobj["public"] != null) { 
    myobj["public"].push(["newkey", "newval"]); 
} else { 
    myobj["public"] = ["newkey", "newval"]; 
} 
+0

Cuando trato de hacer esto termino con el siguiente '{" public ": {" 0 ": [" el29t7 "," 3bmGDy "]}}" {\ "public \": {\ "0 \": [\ "el29t7 \", \ "3bmGDy \"]}} " 'de los dos console.logs diferentes (modifiqué un poco el código para trabajar con lo que dices) (Los valores se pueden repetir como un fyi) – MasterGberry

1

En este caso, piense en un objeto de JavaScript literal {} como una matriz asociativa de PHP.

Teniendo en cuenta que, una "matriz de matrices" en realidad se parece a esto (usando su salida deseada arriba):

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

Así que aquí tenemos un objeto literal con una sola propiedad llamada "público", cuyo valor es una matriz bidimensional.

Si asignamos lo anterior a una variable que puede entonces push otra matriz en "público" de esta manera:

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 's valor es ahora:

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

Así que ahora "público "es una matriz cuya longitud es 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 tiene muy buena documentación en Array para obtener información sobre otras funciones que pueda necesitar. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array

+0

es diferente a la solicitud OP – charlietfl

+0

sí, pero el OP mencionó específicamente una "matriz de matrices" –