Jak zkopírovat objekt? – JavaScript, AJAX, jQuery – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Jak zkopírovat objekt? – JavaScript, AJAX, jQuery – Fórum – Programujte.comJak zkopírovat objekt? – JavaScript, AJAX, jQuery – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
oxidián0
Věrný člen
13. 7. 2016   #1
-
0
-

Je v JS něco jako clone? var objcopy = clone obj; nebo var objcopy = new obj?

To druhé jsem už zkoušel a nejelo mi to.

Můj kód:

/* Objekt který chci duplikovat:*/

var advanced_obj = {
  site_rule : "",
  description : "",
  tag_1 : "",
  action_1 : "",
  parent_1 : "",
  tag_2 : "",
  action_2 : "",
  parent_2 : "",
  tag_3 : "",
  action_3 : "",
  parent_3 : ""  
}

/* Následuje část kódu z funkce */

  for (var k in advanced_obj) {
    advanced_obj[k] = document.getElementById(k).value;
    }  
  data.advanced[title] = advanced_obj;


Je to součást funkce save() která ukládá nastavení profilu. To jak to je současně zdá se, že když následně uložím data do souboru

  chrome.storage.local.set({ advanced : data.advanced, profiles: data.profiles, default_profiles: data.default_profiles  }, 
    () => {
    chrome.storage.local.get(null, (res) => { 
      console.log("I saved data:")
      console.log(res)} )
    } 
  )

tak ve všech profilech se mi objevil stejný záznam ( nastavil jsem záznam site_rule na http adresu a ta se objevila ve všech profilech) a tak se domnívám, že výše uvedeným přiřazením data.advanced[title] = advanced_obj; jsem jen uložil odkaz na objekt což v důsledku způsobilo že prohlížeč uložil stejné data z jednoho profilu i do dalších profilů (ale ukládal jsem data z jednoho aktuálně editovaného profilu). Takže bych chtěl dokončit co jsem původně chtěl udělat, ale nevěděl jsem jak to udělat - nejdříve naklonovat ten objekt a pak do něj zkopírovat hodnoty pro daný profil ... profil[title].
 

Nahlásit jako SPAM
IP: 78.45.87.–
Reklama
Reklama
ondrej39+1
Věrný člen
13. 7. 2016   #2
-
0
-

#1 oxidián
Vidím, že používáš ES6. V takovém případě je řešení velmi jednoduché, a to pomocí Object.Assign.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
oxidián0
Věrný člen
13. 7. 2016   #3
-
0
-

Dík,

data.advanced[title] = Object.assign({},advanced_obj);


Můj problém to ale nevyřešilo. Stále se mi to ukládá do více profilů najednou. Tu logiku nechápu

Zkouším taky toto:

  data.advanced[title] = {};
  data.advanced[title] = Object.assign(data.advanced[title],advanced_obj);


Takže vytvořím si několik zkušebních profilů v tomto pořadí

- default,

- write

- something

- interesting

pod každým mám data pro jeden formulář.

Vyberu profil, a do site_rule si napíšu nějaký údaj třeba test, dám uložit.

A test se objeví u více položek ale ne u všech. A tak je to s každým profilem, ale dělá to různě, ne že to uloží do všech profilů. title je jedinečný název profilu, takže mi to nedává vůbec smysl.

Nahlásit jako SPAM
IP: 78.45.87.–
peter
~ Anonymní uživatel
2532 příspěvků
14. 7. 2016   #4
-
0
-

function mo()
{
this.site_rule : "";
}
obj1 = new mo();
obj2 = new mo();

Klonovani dat pak resim cyklem.
Bohuzel nejsem u sveho pc, jinak bych ti mohl pridat kod, ktery  jsem si udelal pro spravu databaze. Kde pro pridavani zaznamu do pole naklonuji strukturu radku. Vyuzival jsem to pro tabulky chatu :) jako text, seznam uzivatelu a tak

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:9031:c5...–
oxidián0
Věrný člen
14. 7. 2016   #5
-
0
-

Zdá se ale že problém bude někde jinde.

Zkoušel jsem toto:

  data.advanced[title] = {
  site_rule : "",
  description : "",
  tag_1 : "",
  action_1 : "",
  parent_1 : "",
  tag_2 : "",
  action_2 : "",
  parent_2 : "",
  tag_3 : "",
  action_3 : "",
  parent_3 : ""  
  }

  for (var k in advanced_obj)
    data.advanced[title][k] = document.getElementById(k).value;


A víš co? Všechny položky kromě první se vynulujou na "". K tomu ta co jsem měnil obsahuje text title. Takže když změním jednu a pak změním druhou tak ta předchozí se přepíše na "" a druhá se uloží na title. To by u normálního objektu být nemělo. Je to jak kdyby se tím title odkazovalo na tři různé objekty.

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Věrný člen
14. 7. 2016   #6
-
0
-

Chybu jsem našel, bylo to špatnou podmínkou a taky jsem přehlédl ještě jedno místo kde se ten objekt měl advanced_obj kopírovat a tam jsem jen udělal = advanced_obj;

Nahlásit jako SPAM
IP: 78.45.87.–
peter
~ Anonymní uživatel
2532 příspěvků
14. 7. 2016   #7
-
0
-

   

<div id="parent_2">Tatinek</div>

<script>
x = {
  site_rule : "",
  description : "",
  tag_1 : "",
  action_1 : "",
  parent_1 : "",
  tag_2 : "",
  action_2 : "",
  parent_2 : "",
  tag_3 : "",
  action_3 : "",
  parent_3 : ""  
  }

y = {};
key = '';
o = null;
  for (key in x)
{
    o = document.getElementById(key);
     y[key] = (o && (o.value || o.innerHTML || o.text)) || x[key];
}
alert(x.toSource())
alert(y.toSource())

</script>


Mi tvuj kod normalne funguje. Jen jsem z tama vyhodil ty slozite nazvy a doplnil o existenci objektu v html.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:30e9:3e...–
oxidián0
Věrný člen
14. 7. 2016   #8
-
0
-

Kdyby ses zabýval programováním doplňků tak bych ti ten kód poslal, takhle to asi nemá moc smysl. Myslel jsem že už se to vyřešilo, ale ne. Je to moc podivné a už nevím jak to odladit. Problém je že v JS ani nemohu zobrazit adresu na kterou ta proměnná odkazuje, abych si ověřil jestli je tam někde něco špatně. Podle analýzy co jsem dělal naposled se zdá že data se ukládají správně, ale nesprávně se načítají. Při otevření stránky vidím správné uložené hodnoty. Jakmile ale přepnu na jiný profil a pak zase zpět tak tam jsou hodnoty jiné aniž bych cokoliv znova ukládal.

Nahlásit jako SPAM
IP: 78.45.87.–
peter
~ Anonymní uživatel
2532 příspěvků
14. 7. 2016   #9
-
0
-

Tak mas asi nekde spatne logiku. Kdyz to nejde, doporucuji vse zkopirovat do vedlejsiho souboru, smazat a zacit znovu. Postupne si odlad kazdy krok zvlast.

Nevim, co myslis zobrazenim cesty, ale objekt si muzes vypisovat. Jen si musis davat bacha na klicova slova jako window a pod. Tam je schopen se zacyklit pri prochazeni vsech vetsi objektu.

str = '';
for (key in x) {str += key + "\n"';}
alert(str);

Jo, uz jsem u sebe, takze pak kodu, co pouzivam v tom chatu. Pri selectu celej objekt naklonuji, protoze jinak by mi editoval zaznam v db (js tabulce s objekty). Coz nechci.
U JS je ta nevyhoda, ze nemuzes definovat, jestli ches klon objektu nebo jenom ukazatel. automaticky dava ukazatel :)

function is_object(data)
    {
    return typeof(data)==='object' || typeof(data)==='array';
    }

function cloneObject(obj)
    {
    var i, new_obj;
    new_obj = {};
    for (i in obj)
        {
        if (!is_object(obj[i]))
            {new_obj[i] = obj[i];}
        else    {new_obj[i] = cloneObject(obj[i]);}
        }
    return new_obj;
    }

//-----

function classDb(structure)
{
this.table = [];
this.structure = structure;
this.drop = function(data)
	{
	this.table = [];
	}

this.import = function(data)
	{
	var i;
	this.table = data;
	for(i=0;i<this.table.length;i++)
		{
		this.table[i].index = i;
		}
	}

this.export = function(data)
	{
	return this.table;
	}

this.insert = function(data)
	{
	var key, new_row, index;
	if (!is_object(data))
		{
		return;
		}
	index   = this.table.length;
	new_row = new this.structure;
	for (key in new_row)	//this.table[index]
		{
		new_row[key] = data[key] ? data[key] : '';
		}
	new_row.index = index;
	this.table[index] = new_row;
	return new_row;
	}

this.update = function(where,data)
	{
	var row,key,value;
	row = this.select(where);			// read
	if (row && is_object(row))
		{
		for(key in where)
			{
			value = where[key];
			if (!is_null(value) && isset(row[key]))		// ignore undefined
				{
				row[key] = value;
				}
			}
		this.table[row.index] = row;			// write
		return row;
		}
	return false;
	}

this.select = function(where)
	{
	var i,row,bool,key,value;
	for(i=0;i<this.table.length;i++)
		{
		row  = this.table[i];
		bool = true;
		for(key in where)
			{
			value = where[key];
			if (!is_null(value) && isset(row[key]))		// ignore undefined
				{
				bool &= row[key] == value;
				if (!bool) break;
				}
			}
		if (bool)
			{
			return cloneObject(row);
			}
		}
	return false;
	}
}

// ----
function classUser()
{
this.index   = null;	// unique autoincrement
this.id      = null;
this.name    = null;
this.psw     = null;
this.ip      = null;
this.time    = null;
this.id_peer = null;
this.color   = null;
}
/ ---

	CHAT.users_db    = new classDb(classUser);
//...
CHAT.userlist.add = function (user)
	{
	CHAT.users_db.insert(user);
	CHAT.userlist.show();
	};

Nahlásit jako SPAM
IP: 2001:718:2601:26c:cde5:31...–
oxidián0
Věrný člen
14. 7. 2016   #10
-
0
-

nepsal jsem cesta ale adresa (paměti). Jdu ověřit selectedIndex a title jaké maj hodnoty a třeba něco najdu.

Edit: Asi jsem na to přišel

Mám tam select box, kde vybírám profil. Když vyberu profil tak spouštím funkci restore

function restore(e = null)

funkce určená jak pro nahrání defaultních hodnot do formuláře. Předpokládal jsem, že když vyberu profil tak mám nastavit defaultní profil (to je ten co byl uložen naposled že ho používám). A to je chyba. Vždyť když vyberu profil, musím tam dosadit aktuální profil a ne defaultní.

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Věrný člen
14. 7. 2016   #11
-
0
-

Třídy v JS se používaj od kdy? Nikdy jsem to ještě neviděl.

Jinak ten script nejspíš nahraju na net až bude hotový, je to ale addon takže pokud tě to zajímá je třeba k tomu Firefox 48 beta (mělo by jít stáhnout jestli není momentálně spadlý server). Výhoda toho co dělám, napíšu si script a mohu na něm upravit jakoukoliv webovou stránku (prostě ten svůj script k té stránce připojím). Případně si napsat script na stahování obrázků. Ale teprve se to učím. Takže v tom Firefoxu se dá na stránce about:debugging připojit ten addon a otestovat si ho.

Nahlásit jako SPAM
IP: 78.45.87.–
Kit+11
Guru
14. 7. 2016   #12
-
0
-

#11 oxidián
Někde vidíš nějakou třídu?

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
oxidián0
Věrný člen
14. 7. 2016   #13
-
0
-

Tak mi vysvětli co tam dělá to this?

Nahlásit jako SPAM
IP: 78.45.87.–
Kit+11
Guru
14. 7. 2016   #14
-
0
-

#13 oxidián
To je odkaz na instanční proměnnou objektu. S třídou to nemá nic společného.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ondrej39+1
Věrný člen
14. 7. 2016   #15
-
0
-

#11 oxidián
Jinak třídy se používají v JavaScriptu od ES6, kdy do jazyka bylo doplněno kromě jiných funkcí jak klíčové slovo class, tak klíčové slovo extends. :)

Dříve určitou roli tříd a objektů hrály díky prototypové dědičnosti právě funkce.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
oxidián0
Věrný člen
14. 7. 2016   #16
-
0
-

A co používání namespaců?

Mám čtyři moduly (scripty) do addonu. Jedná se o moduly s volbami. Používají stejné názvy proměnných, ale bylo by lépe to dát do namespaců. Jaká je praxe?

Nahlásit jako SPAM
IP: 78.45.87.–
Kit+11
Guru
15. 7. 2016   #17
-
0
-

#16 oxidián
Nepoužívat globální proměnné.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:d880:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
oxidián0
Věrný člen
15. 7. 2016   #18
-
0
-

Já se ptál na příklad, ale dobré už jsem si to našel.

var yourNamespace = {

    foo: function() {
    },

    bar: function() {
    }
};

...

yourNamespace.foo();


Paradox je, že yourNamespace je globální proměnná. A pojmenovávání namespaců?

Jak se říká tomuto (myslím první řádek)?

var { Hotkey } = require("sdk/hotkeys");
var showHotKey = Hotkey({
  combo: "accel-shift-o",
  onPress: function() {
    showMyPanel();
  }
});
var hideHotKey = Hotkey({
  combo: "accel-alt-shift-o",
  onPress: function() {
    hideMyPanel();
  }
});
Nahlásit jako SPAM
IP: 78.45.87.–
ondrej39+1
Věrný člen
15. 7. 2016   #19
-
0
-

#16 oxidián
Pokud jde o běžný JavaScript, kdy si napíšeš skripty do pár .js souborů a ty si poté přimo includneš na stránku, tak nevím. Pokud ale pracuješ v Node, tam se Namespace nepoužívají, protože nemají moc účel. Každý modul jsi schopný naimportovat přímo ze složky a protože se importuje přímo do proměnné, můžeš mu dát jakýkoliv název chceš.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
ondrej39+1
Věrný člen
15. 7. 2016   #20
-
0
-

#18 oxidián
To je Object Destructuring, další z nových věcí v ES6. Je to stejné jako bys udělal:

var hotkeys = require("sdk/hotkeys");
var Hotkey = hotkeys.Hotkey;

Prostě syntactic sugar pro importy, destrukturalizaci objektů, případně pro předávání pojmenovaných parametrů.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
oxidián0
Věrný člen
15. 7. 2016   #21
-
0
-

Programátoři Mozilly to používali v SDK, ale je to už minulost, protože dneska se prosazuje Webextension API, který má aktivní podporu multiprocesoringu. Tedy od verze Firefoxu 48.

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Věrný člen
16. 7. 2016   #22
-
0
-

No a vysvětlíš mi jak přiřadit funkci která je uvnitř namespacu? Aktuálně mám tyto tři příkazy mimo namespace:

chrome.storage.local.get(['initiated'], checkIfExists)
document.addEventListener('DOMContentLoaded', restore);
document.getElementById("save").addEventListener("submit", save);

Takže celkem tři funkce přiřazuji, ale jak to udělat, abych řekl kterého namespacu se to týká?

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Věrný člen
17. 7. 2016   #23
-
0
-
Nahlásit jako SPAM
IP: 78.45.87.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

Podobná vlákna

Ukazovatel na objekt — založil Anonymní uživatel

Objekt s číslem — založil Paulí

Objekt a polia? — založil WraCkeR

Objekt cin — založil q

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý