¿Cómo debo almacenar una matriz de objetos?

Tengo un objeto image puedo hacer cosas como image.top y devolverá un valor, o que puedo hacer image.myPoints[0].left y devolverá un valor. Yo, básicamente, tener esta imagen del objeto que almacena los valores para mí. Quiero ser capaz de poner varios image objetos en una matriz para que yo pudiera hacer algo como esto:

$("#toPinpoint").mapImage({
                useAjax: false,
                pinpoints: [ { "top": 50,
                           "left": 280,
                           "width": 200,
                           "height": 200},
                         { "top": 0,
                           "left": 0,
                           "width": 300,
                           "height": 74 } ] 
            });

Puedo usar esta función para crear el objeto, los puntitos se agregan al objeto. Cuando el mapImage se llama a la función esto es lo que sucede:

    $.fn.mapImage = function(options){



    //Set user input options and defaults
    var optionConfig = $.extend({}, $.fn.mapImage.defaults, options);

    image=this;
    this.image = this;

    //Assign defaults
    this.previewMode = optionConfig.previewMode;
    this.pinpoints = optionConfig.pinpoints;
    image.pinpoints = optionConfig.pinpoints;
    image.pinpointCount = 0;
    image.selected = 0;
    ...}

Esto establece las propiedades de la imagen y ahora quiero modificar el properities con mi aplicación, a continuación, GUARDE estos image objetos en una matriz.

Mi problema con esto es que la matriz se carga con los objetos de la imagen, pero parece que para llenar la matriz con el objeto acabo de empujar, de modo que no se guarde mis viejos objetos de la imagen. Por ejemplo, si hago myArray[0].myPoints[0].left , digamos que retruns 30, y luego empujo a otro objeto de la imagen que ha myPoints[0].a la izquierda igual a 20, el primer objeto de la imagen que tengo en la matriz se convierte en 20 en lugar de guardarlo como 30. Si hay una buena manera de resolver este problema sería muy apreciado. Gracias!

  • Me parece que no puede replicar este. Puedes publicar una descripción más detallada del ejemplo de código? Cuando usted dice «pop» otra imagen, ¿te refieres a la inserción? Porque tienen el resultado opuesto.
  • Marshall: me refería a empujar lo siento, y sí voy a poner un ejemplo más detallado hasta
  • Su anti-patrones están mostrando: image = this; this.image = this; Hola, soy una referencia circular!
InformationsquelleAutor anthonypliu | 2011-02-16

3 Kommentare

  1. 4

    Utilizando array.push(x) debe agregar x a la final de array. Sin embargo, no se creará una copia de x, así que si usted, a continuación, cambiar un atributo de x y push() de nuevo, su matriz contendrá dos instancias de x con el atributo actualizado – sospecho que esto es lo que estamos viendo. (Que es, se le puede cambiar el top propiedad de su image y push()ing de nuevo, en lugar de crear una nueva image a push()).

    • Yo creo que tu tienes toda la razón, pero, ¿cómo puedo arreglar esto? ¿cómo puedo crear una nueva instancia de este objeto cada vez que puedo agregar es
    • Depende de cómo se está creando el objeto. Debe ser algo como var secondImage = new MyImage();. Digo «Miimagen» en lugar de «Imagen» ya que este último es ya objeto DOM de javascript. (Una vez más, que sería útil para poner una más amplia código de ejemplo para tener una mejor idea de lo que has actualmente tengo :))
    • Usted necesidad de una «nueva» de la imagen, no de la matriz. ¿Cómo crear la primera imagen?
    • he actualizado con un mejor ejemplo, esta es casi mi código
  2. 0
    var myArray = new Array();

    Que usted necesita para utilizar la «nueva» palabra clave.

    • Pensé que esto al principio, pero omitiendo la new palabra clave parece funcionar correctamente y pasa la pelusa.
    • Sólo porque pasa pelusa no significa que sea el uso previsto, y su sentido utilizar las funciones de constructor sin la new palabra clave.
    • Yo sé, yo no recomendaría el uso de la misma sin la new, y se sorprendió al ver que funcionaba y pasado pelusa, porque parece horriblemente mal para mí.
    • ¿cuál es la diferencia entre el var myArray = new Array(); y var myArray = [];
  3. 0

    Creo que estás haciendo esto más complicado de lo que deben ser.

    (function($){
      $.fn.mapImage = function(options) {
        var defaults = { /* your defaults here */ };
    
        //Merge default options with passed in options and store
        options = ($.extend({}, defaults, options));
    
        //Do other stuff
      };
    })(jQuery);
    
    //Backup current pinpoints and modify the current one
    $('#toPinpoints').data('pinpoints-backup', $('#toPinpoints').data('pinpoints').splice());
    $('#toPinpoints').data('pinpoints')[0].top = 100;
    
    //Push a new array of pinpoints
    $('#toPinpoints').data('pinpoints').push({"top": 100, "left": 50, "width": 200, "height": 150});

    Tener cuidado con jQuery.extender() como no opera de forma recursiva, de modo que cualquier matrices que se encuentran dentro de los valores predeterminados de la sub-matriz será reemplazada por completo por aquellos en las opciones de la matriz, no fusionado.

    Si usted necesita para acceder a la detecta los datos más tarde, es posible que desee utilizar jQuery.de datos() por hacer algo como this.data($.extend({}, $.fn.mapImage.defaults, options)); en lugar de reasignar las opciones de la variable. La señala para un elemento dado puede tener acceso en cualquier lugar por $('#toPinpoint').data('pinpoints') que se devolverá el mismo array que se pasa a través de opciones para mapImage(). Entonces, podría atravesar toda la identifica con jQuery.cada().

    Si me estoy perdiendo de algo en lo que estamos tratando de hacer, por favor hágamelo saber.

    • Hey, que definitivamente tiene sentido, pero ahora, ¿cómo puedo agregar varios apunta a un array? Esto me da una serie de puntitos, ahora digamos que quiero modificar todas estas identifica los valores y, a continuación, introdúzcalo en una matriz, así que tengo los VIEJOS valores y los NUEVOS valores
    • Usted puede almacenar cualquier cosa en jQuery.data(), mira en la API de doc para ello. Llamar .data('pinpoints')[0].top = 100 debe modificar el valor actual. Usted puede agregar nuevos señala a través de .data('pinpoints').push(newPinpoints). Si necesita hacer una copia de seguridad de los datos actuales, se podría hacer .data('pinpoints-backup', .data('pinpoints).splice()). (Tenga en cuenta que estoy omitiendo el this palabra clave antes de .data() como usted podría estar haciendo fuera de ella y la necesidad de utilizar un selector)
    • (He editado mi respuesta por mi comentario (lo Siento por los múltiples comentarios en una fila)

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...