valores recorrer objetos objeto lista hacer eliminar elemento convertir construir buscar aƱadir array javascript unique-id

recorrer - lista de objetos javascript



ID de objeto de JavaScript (6)

Acabo de encontrarme con esto y pensé en agregar mis pensamientos. Como otros han sugerido, recomendaría agregar ID manualmente, pero si realmente quiere algo parecido a lo que ha descrito, puede usar esto:

var objectId = (function () { var allObjects = []; var f = function(obj) { if (allObjects.indexOf(obj) === -1) { allObjects.push(obj); } return allObjects.indexOf(obj); } f.clear = function() { allObjects = []; }; return f; })();

Puede obtener la ID de cualquier objeto llamando a objectId(obj) . Luego, si desea que la ID sea una propiedad del objeto, puede extender el prototipo:

Object.prototype.id = function () { return objectId(this); }

o puede agregar manualmente una ID a cada objeto agregando una función similar como método.

La principal advertencia es que esto evitará que el recolector de basura destruya los objetos cuando se salen del alcance ... nunca lo dejarán fuera del alcance de la matriz de todos los allObjects , por lo que es posible que las pérdidas de memoria sean un problema. Si está configurado para usar este método, debe hacerlo solo con fines de depuración. Cuando sea necesario, puede hacer objectId.clear() para borrar todos los allObjects y dejar que el GC haga su trabajo (pero desde ese punto se restablecerán todos los identificadores de los objetos).

¿Los objetos / variables de JavaScript tienen algún tipo de identificador único? Al igual que Ruby tiene object_id . No me refiero al atributo id del DOM, sino a algún tipo de dirección de memoria.


En realidad, no es necesario modificar el prototipo de object . Lo siguiente debería funcionar para ''obtener'' identificaciones únicas para cualquier objeto, de manera suficientemente eficiente.

var __next_objid=1; function objectId(obj) { if (obj==null) return null; if (obj.__obj_id==null) obj.__obj_id=__next_objid++; return obj.__obj_id; }


No, los objetos no tienen un identificador incorporado, aunque puede agregar uno modificando el prototipo del objeto. Aquí hay un ejemplo de cómo puedes hacer eso:

(function() { var id = 0; function generateId() { return id++; }; Object.prototype.id = function() { var newId = generateId(); this.id = function() { return newId; }; return newId; }; })();

Dicho esto, en general la modificación del prototipo de objeto se considera muy mala práctica. En su lugar, le recomiendo que asigne manualmente una identificación a los objetos según sea necesario o que use una función touch como otros han sugerido.


Si desea buscar / asociar un objeto con un identificador único sin modificar el objeto subyacente, puede usar un WeakMap :

// Note that object must be an object or array, // NOT a primitive value like string, number, etc. var objIdMap=new WeakMap, objectCount = 0; function objectId(object){ if (!objIdMap.has(object)) objIdMap.set(object,++objectCount); return objIdMap.get(object); } var o1={}, o2={}, o3={a:1}, o4={a:1}; console.log( objectId(o1) ) // 1 console.log( objectId(o2) ) // 2 console.log( objectId(o1) ) // 1 console.log( objectId(o3) ) // 3 console.log( objectId(o4) ) // 4 console.log( objectId(o3) ) // 3

El uso de un WeakMap garantiza que los objetos aún puedan ser recolectados en la basura.


Utilizando ES6 + Símbolos.

Utilice la exportación del módulo ES6 para el símbolo si se prefiere un símbolo único; de lo contrario, vaya con Symbo

(function () { let id = 0; const generateId = () => ++id; // export const identifier = Symbol(''identifier''); const identifier = Symbol.for(''identifier''); Object.prototype[identifier] = function () { const id = generateId(); this.id = this.id || id; return this.id; }; })();


Utilizando ES6 + Símbolos.

Use ES6 Module export para Symbol si se prefiere un símbolo único; de lo contrario, vaya con Symbols en el registro global.

(function () { let id = 0; const generateId = () => ++id; // export const identifier = Symbol(''identifier''); //unique symbol const identifier = Symbol.for(''identifier''); //symbol in global registry Object.prototype[identifier] = function () { const id = generateId(); this.id = this.id || id; return this.id; }; })();