From 9f09dab14c39ce13e1c6cdb6495cab8ee0765369 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Sat, 24 Jul 2021 12:38:08 +0430 Subject: [PATCH 01/17] Translate a part of article --- 1-js/05-data-types/07-map-set/article.md | 54 ++++++++++++------------ 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index bd6cad562..32c76a2a9 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -1,50 +1,50 @@ -# Map and Set +# ساختارهای Map and Set -Till now, we've learned about the following complex data structures: +تا حالا ما درباره ساختارهای داده پیچیده زیر آشنا شدیم: -- Objects are used for storing keyed collections. -- Arrays are used for storing ordered collections. +- شیءها برای ذخیره‌سازی مجموعه‌های کلیددار استفاده می‌شوند. +- آرایه‌ها برای ذخیره‌سازی مجموعه‌های ترتیبی استفاده می‌شوند. -But that's not enough for real life. That's why `Map` and `Set` also exist. +اما این در زندگی واقعی کافی نیستند. به همین دلیل است که `Map` و `Set` وجود دارند. -## Map +## ساختار Map -[Map](mdn:js/Map) is a collection of keyed data items, just like an `Object`. But the main difference is that `Map` allows keys of any type. +[Map](mdn:js/Map) مجموعه‌ای از داده‌های کلیددار است، درست مانند `Object`. اما تفاوت اصلی آنها این است که `Map` اجازه می‌دهد که کلیدها از هر نوعی باشند. -Methods and properties are: +متدها و ویژگی‌های آن: -- `new Map()` -- creates the map. -- `map.set(key, value)` -- stores the value by the key. -- `map.get(key)` -- returns the value by the key, `undefined` if `key` doesn't exist in map. -- `map.has(key)` -- returns `true` if the `key` exists, `false` otherwise. -- `map.delete(key)` -- removes the value by the key. -- `map.clear()` -- removes everything from the map. -- `map.size` -- returns the current element count. +- `new Map()` -- map را می‌سازد. +- `map.set(key, value)` -- value را به واسطه key ذخیره می‌کند. +- `map.get(key)` -- مقدار را به واسطه key برمی‌گرداند، اگر `key` در map وجود نداشته باشد `undefined` برگردانده می‌شود. +- `map.has(key)` -- اگر `key` وجود داشته باشد `true` برگردانده می‌شود، در غیر این صورت `false`. +- `map.delete(key)` -- مقدار را به واسطه key حذف می‌کند. +- `map.clear()` -- همه چیز را از map حذف می‌کند. +- `map.size` -- تعداد المان‌های کنونی را برمی‌گرداند. -For instance: +برای مثال: ```js run let map = new Map(); -map.set('1', 'str1'); // a string key -map.set(1, 'num1'); // a numeric key -map.set(true, 'bool1'); // a boolean key +map.set('1', 'str1'); // یک کلید رشته‌ای +map.set(1, 'num1'); // یک کلید عددی +map.set(true, 'bool1'); // boolean یک کلید -// remember the regular Object? it would convert keys to string -// Map keeps the type, so these two are different: -alert( map.get(1) ); // 'num1' -alert( map.get('1') ); // 'str1' +// شیء را به یاد دارید؟ شیء کلیدها را به رشته تبدیل می‌کرد +// :نوع را حفظ می‌کند، پس این دو تفاوت دارند Map +alert( map.get(1) ); // '1عدد' +alert( map.get('1') ); // '1رشته' alert( map.size ); // 3 ``` -As we can see, unlike objects, keys are not converted to strings. Any type of key is possible. +همانطور که می‌بینیم، برخلاف شیءها، کلیدها به رشته تبدیل نمی‌شوند. هر نوع از کلید امکان‌پذیر است. -```smart header="`map[key]` isn't the right way to use a `Map`" -Although `map[key]` also works, e.g. we can set `map[key] = 2`, this is treating `map` as a plain JavaScript object, so it implies all corresponding limitations (only string/symbol keys and so on). +```smart header="`map[key]` راه درستی برای استفاده از `Map` نیست" +اگرچه `map[key]` هم کار می‌کند، برای مثال ما می‌توانیم بنویسیم `map[key]` = 2`، این کار یعنی با `map` مانند یک شیء ساده جاوااسکریپت کار کنیم، پس باعث ایجاد تمام محدودیت‌های متناظر می‌شود (فقط کلیدهای رشته‌ای/سمبلی مجاز خواهد بود و دیگر محدودیت‌ها). -So we should use `map` methods: `set`, `get` and so on. +پس ما باید از متدهای `map` استفاده کنیم: `set`، `get` و... ``` **Map can also use objects as keys.** From cec5d923f49d533bfb23ab647f40201faecfb9c2 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Sat, 24 Jul 2021 12:38:49 +0430 Subject: [PATCH 02/17] Translate a word in title --- 1-js/05-data-types/07-map-set/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index 32c76a2a9..7f694ed2d 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -1,5 +1,5 @@ -# ساختارهای Map and Set +# ساختارهای Map و Set تا حالا ما درباره ساختارهای داده پیچیده زیر آشنا شدیم: From 643da0aa82a43051061b34abce9d50c344cafb3f Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Sat, 24 Jul 2021 12:39:31 +0430 Subject: [PATCH 03/17] Change a line for better translation --- 1-js/05-data-types/07-map-set/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index 7f694ed2d..cf078be93 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -6,7 +6,7 @@ - شیءها برای ذخیره‌سازی مجموعه‌های کلیددار استفاده می‌شوند. - آرایه‌ها برای ذخیره‌سازی مجموعه‌های ترتیبی استفاده می‌شوند. -اما این در زندگی واقعی کافی نیستند. به همین دلیل است که `Map` و `Set` وجود دارند. +اما اینها در زندگی واقعی کافی نیستند. به همین دلیل است که `Map` و `Set` وجود دارند. ## ساختار Map From de9cec0644227ad9682622b409a10c886e3a510a Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Sat, 24 Jul 2021 12:42:51 +0430 Subject: [PATCH 04/17] Revert two comment translations --- 1-js/05-data-types/07-map-set/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index cf078be93..ca4aa5270 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -33,8 +33,8 @@ map.set(true, 'bool1'); // boolean یک کلید // شیء را به یاد دارید؟ شیء کلیدها را به رشته تبدیل می‌کرد // :نوع را حفظ می‌کند، پس این دو تفاوت دارند Map -alert( map.get(1) ); // '1عدد' -alert( map.get('1') ); // '1رشته' +alert( map.get(1) ); // 'num1' +alert( map.get('1') ); // 'str1' alert( map.size ); // 3 ``` From b7b92aa677e61fdc27571624ee18649153a90645 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Sun, 25 Jul 2021 23:00:22 +0430 Subject: [PATCH 05/17] Translate a part of article --- 1-js/05-data-types/07-map-set/article.md | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index ca4aa5270..45eb6835d 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -47,51 +47,51 @@ alert( map.size ); // 3 پس ما باید از متدهای `map` استفاده کنیم: `set`، `get` و... ``` -**Map can also use objects as keys.** +**ساختار Map می‌تواند از شیءها هم به عنوان کلید استفاده کند.** -For instance: +برای مثال: ```js run let john = { name: "John" }; -// for every user, let's store their visits count +// بیایید برای هر کاربر تعداد دفعات بازدیدشان را ذخیره کنیم let visitsCountMap = new Map(); -// john is the key for the map +// کلید است map برای john visitsCountMap.set(john, 123); alert( visitsCountMap.get(john) ); // 123 ``` -Using objects as keys is one of the most notable and important `Map` features. The same does not count for `Object`. String as a key in `Object` is fine, but we can't use another `Object` as a key in `Object`. +استفاده از شیءها به عنوان کلید یکی از ویژگی‌های مهم و قابل توجه `Map` است. چنین چیزی برای `Object` ممکن نیست. رشته به عنوان کلید در `Object` مشکلی ندارد، اما ما نمی‌توانیم از یک `Object` دیگر به عنوان کلید در `Object` استفاده کنیم. -Let's try: +بیایید امتحان کنیم: ```js run let john = { name: "John" }; let ben = { name: "Ben" }; -let visitsCountObj = {}; // try to use an object +let visitsCountObj = {}; // استفاده از یک شیء -visitsCountObj[ben] = 234; // try to use ben object as the key -visitsCountObj[john] = 123; // try to use john object as the key, ben object will get replaced +visitsCountObj[ben] = 234; // به عنوان کلید ben استفاده از شیء +visitsCountObj[john] = 123; // می‌شود ben به عنوان کلید که جایگزین شیء john استفاده از شیء *!* -// That's what got written! +// !این چیزی است که نوشته شده alert( visitsCountObj["[object Object]"] ); // 123 */!* ``` -As `visitsCountObj` is an object, it converts all `Object` keys, such as `john` and `ben` above, to same string `"[object Object]"`. Definitely not what we want. +به دلیل این که `visitsCountObj` یک شیء است، تمام کلیدهای `Object` مانند `john` و `ben` در بالا را به رشته `"[object Object]"` تبدیل می‌کند. قطعا چیزی نیست که ما بخواهیم. -```smart header="How `Map` compares keys" -To test keys for equivalence, `Map` uses the algorithm [SameValueZero](https://tc39.github.io/ecma262/#sec-samevaluezero). It is roughly the same as strict equality `===`, but the difference is that `NaN` is considered equal to `NaN`. So `NaN` can be used as the key as well. +```smart header="چگونگی مقایسه کلیدها در `Map`" +برای آزمایش برابری کلیدها، `Map` از الگوریتم [SameValueZero](https://tc39.github.io/ecma262/#sec-samevaluezero) استفاده می‌کند. این الگوریتم تقریبا با مقایسه برابری سخت‌گیرانه `===` یکسان است، اما تفاوت این است که `NaN` با `NaN` یکسان فرض می‌شود. پس `NaN` هم می‌تواند به عنوان کلید استفاده شود. -This algorithm can't be changed or customized. +این الگوریتم نمی‌تواند تغییر داده یا شخصی‌سازی شود. ``` -````smart header="Chaining" -Every `map.set` call returns the map itself, so we can "chain" the calls: +````smart header="زنجیره‌ای" +تمام `map.set`ها خود map را برمی‌گردانند، پس ما می‌توانیم فراخوانی‌ها را «زنجیره‌ای» انجام دهیم: ```js map.set('1', 'str1') From 84ef15b34fa2e5f11186d28004186644c992c4b1 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Mon, 26 Jul 2021 15:59:34 +0430 Subject: [PATCH 06/17] Translate a part of article --- 1-js/05-data-types/07-map-set/article.md | 46 ++++++++++++------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index 45eb6835d..3be03a27d 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -91,7 +91,7 @@ alert( visitsCountObj["[object Object]"] ); // 123 ``` ````smart header="زنجیره‌ای" -تمام `map.set`ها خود map را برمی‌گردانند، پس ما می‌توانیم فراخوانی‌ها را «زنجیره‌ای» انجام دهیم: +تمام `map.set`ها خود map را برمی‌گردانند، پس ما می‌توانیم فراخوانی‌ها را به صورت «زنجیره‌ای» انجام دهیم: ```js map.set('1', 'str1') @@ -101,15 +101,15 @@ map.set('1', 'str1') ```` -## Iteration over Map +## حلقه زدن در Map -For looping over a `map`, there are 3 methods: +برای حلقه زدن در `map` 3 متد وجود دارد: -- `map.keys()` -- returns an iterable for keys, -- `map.values()` -- returns an iterable for values, -- `map.entries()` -- returns an iterable for entries `[key, value]`, it's used by default in `for..of`. +- `map.keys()` -- یک حلقه‌پذیر برای کلیدها برمی‌گرداند، +- `map.values()` -- یک حلقه‌پذیر برای مقدارها برمی‌گرداند، +- `map.entries()` -- یک حلقه‌پذیر برای برای اطلاعات به شکل `[key, value]` برمی‌گرداند که به صورت پیش‌فرض در `for..of` استفاده می‌شود. -For instance: +برای مثال: ```js run let recipeMap = new Map([ @@ -118,41 +118,41 @@ let recipeMap = new Map([ ['onion', 50] ]); -// iterate over keys (vegetables) +// در کلیدها حلقه بزن (سبزیجات) for (let vegetable of recipeMap.keys()) { alert(vegetable); // cucumber, tomatoes, onion } -// iterate over values (amounts) +// در مقدارها حلقه بزن (میزان آنها) for (let amount of recipeMap.values()) { alert(amount); // 500, 350, 50 } -// iterate over [key, value] entries -for (let entry of recipeMap) { // the same as of recipeMap.entries() - alert(entry); // cucumber,500 (and so on) +// حلقه بزن [key, value] در اطلاعات به شکل +for (let entry of recipeMap) { // recipeMap.entries() مشابه با + alert(entry); // (و بقیه اطلاعات) cucumber,500 } ``` -```smart header="The insertion order is used" -The iteration goes in the same order as the values were inserted. `Map` preserves this order, unlike a regular `Object`. +```smart header="ترتیب درج کردن استفاده می‌شود" +حلقه زدن با همان ترتیبی که مقدارها اضافه شده‌اند انجام می‌شود. برخلاف یک `Object` معمولی، `Map` این ترتیب را حفظ می‌کند. ``` -Besides that, `Map` has a built-in `forEach` method, similar to `Array`: +علاوه بر آن، `Map` یک متد `forEach` درون‌ساخت هم دارد، درست شبیه به `Array`: ```js -// runs the function for each (key, value) pair +// اجرا می‌شود (key,value) تابع برای هر جفت recipeMap.forEach( (value, key, map) => { - alert(`${key}: ${value}`); // cucumber: 500 etc + alert(`${key}: ${value}`); // و غیره cucumber: 500 }); ``` -## Object.entries: Map from Object +## متد Object.entries: ایجاد Map از Object -When a `Map` is created, we can pass an array (or another iterable) with key/value pairs for initialization, like this: +زمانی که یک `Map` ساخته می‌شود، ما می‌توانیم برای مقداردهی اولیه، یک آرایه (یا هر حلقه‌پذیر دیگری) را با جفت‌های کلید/مقدار در آن بنویسیم، مثل اینجا: ```js run -// array of [key, value] pairs +// [key, value] آرایه‌ای از جفت‌های let map = new Map([ ['1', 'str1'], [1, 'num1'], @@ -162,9 +162,9 @@ let map = new Map([ alert( map.get('1') ); // str1 ``` -If we have a plain object, and we'd like to create a `Map` from it, then we can use built-in method [Object.entries(obj)](mdn:js/Object/entries) that returns an array of key/value pairs for an object exactly in that format. +اگر ما یک شیء ساده داریم و بخواهیم از آن یک `Map` بسازیم، می‌توانیم از متد درون‌ساخت [Object.entries(obj)](mdn:js/Object/entries) استفاده کنیم که برای یک شیء آرایه‌ای از جفت‌های کلید/مقدار را دقیقا در همان فرمت برمی‌گرداند. -So we can create a map from an object like this: +بنابراین ما می‌توانیم به این صورت از شیء یک map بسازیم: ```js run let obj = { @@ -179,7 +179,7 @@ let map = new Map(Object.entries(obj)); alert( map.get('name') ); // John ``` -Here, `Object.entries` returns the array of key/value pairs: `[ ["name","John"], ["age", 30] ]`. That's what `Map` needs. +اینجا `Object.entries` یک آرایه از جفت‌های کلید/مقدار برمی‌گرداند: `[ ["name","John"], ["age", 30] ]`. این چیزی است که `Map` نیاز دارد. ## Object.fromEntries: Object from Map From 05aeab5bd79475dcb70b561804b10c1f24a383a8 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Tue, 27 Jul 2021 15:50:06 +0430 Subject: [PATCH 07/17] Translate a part of article --- 1-js/05-data-types/07-map-set/article.md | 26 ++++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index 3be03a27d..9be355d2a 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -182,11 +182,11 @@ alert( map.get('name') ); // John اینجا `Object.entries` یک آرایه از جفت‌های کلید/مقدار برمی‌گرداند: `[ ["name","John"], ["age", 30] ]`. این چیزی است که `Map` نیاز دارد. -## Object.fromEntries: Object from Map +## متد Object.fromEntries: ایجاد Object از Map -We've just seen how to create `Map` from a plain object with `Object.entries(obj)`. +ما به تازگی دیدیم که چگونه از یک شیء ساده با استفاده از `Object.entries(obj)` یک `Map` بسازیم. -There's `Object.fromEntries` method that does the reverse: given an array of `[key, value]` pairs, it creates an object from them: +متد `Object.fromEntries` کار برعکس آن را انجام می‌دهد: با دادن یک آرایه از جفت‌های `[key, value]` به آن، یک شیء از آنها می‌سازد: ```js run let prices = Object.fromEntries([ @@ -195,16 +195,16 @@ let prices = Object.fromEntries([ ['meat', 4] ]); -// now prices = { banana: 1, orange: 2, meat: 4 } +// prices = { banana: 1, orange: 2, meat: 4 } حالا داریم alert(prices.orange); // 2 ``` -We can use `Object.fromEntries` to get a plain object from `Map`. +می‌توانیم از `Object.fromEntries` برای ساخت یک شیء ساده از `Map` استفاده کنیم. -E.g. we store the data in a `Map`, but we need to pass it to a 3rd-party code that expects a plain object. +برای مثال ما داده را در یک `Map` دخیره می‌کنیم اما نیاز داریم که آن را به یک کد شخص ثالث بدهیم که یک شیء ساده را قبول می‌کند. -Here we go: +شروع می‌کنیم: ```js run let map = new Map(); @@ -213,23 +213,23 @@ map.set('orange', 2); map.set('meat', 4); *!* -let obj = Object.fromEntries(map.entries()); // make a plain object (*) +let obj = Object.fromEntries(map.entries()); // ساخت یک شیء ساده (*) */!* -// done! +// !انجام شد // obj = { banana: 1, orange: 2, meat: 4 } alert(obj.orange); // 2 ``` -A call to `map.entries()` returns an iterable of key/value pairs, exactly in the right format for `Object.fromEntries`. +فراخونی `map.entries()` یک حلقه‌پذیر از جفت‌های کلید/مقدار برمی‌گرداند، دقیقا در شکل مناسب برای `Object.fromEntries`. -We could also make line `(*)` shorter: +همچنین می‌توانیم خط `(*)` را کوتاه‌تر کنیم: ```js -let obj = Object.fromEntries(map); // omit .entries() +let obj = Object.fromEntries(map); // را حذف کردیم .entries() ``` -That's the same, because `Object.fromEntries` expects an iterable object as the argument. Not necessarily an array. And the standard iteration for `map` returns same key/value pairs as `map.entries()`. So we get a plain object with same key/values as the `map`. +این دو یکسان هستند چون `Object.fromEntries` یک شیء حلقه‌پذیر را به عنوان آرگومان می‌پذیرد. نباید لزوما یک آرایه باشد. یک حلقه‌زدن استاندارد در `map` جفت‌های کلید/مقدار یکسان با `map.entries()` را برمی‌گرداند. بنابراین ما شیء ساده‌ای با کلید/مقدارهای یکسان با `map` دریافت می‌کنیم. ## Set From 52fc61ff06ee1e5dc1a83cfd50319df83a4cd89b Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Wed, 28 Jul 2021 14:33:35 +0430 Subject: [PATCH 08/17] Translate a part of article --- 1-js/05-data-types/07-map-set/article.md | 50 ++++++++++++------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index 9be355d2a..9fdf718a0 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -231,24 +231,24 @@ let obj = Object.fromEntries(map); // را حذف کردیم .entries() این دو یکسان هستند چون `Object.fromEntries` یک شیء حلقه‌پذیر را به عنوان آرگومان می‌پذیرد. نباید لزوما یک آرایه باشد. یک حلقه‌زدن استاندارد در `map` جفت‌های کلید/مقدار یکسان با `map.entries()` را برمی‌گرداند. بنابراین ما شیء ساده‌ای با کلید/مقدارهای یکسان با `map` دریافت می‌کنیم. -## Set +## ساختار Set -A `Set` is a special type collection - "set of values" (without keys), where each value may occur only once. +یک `Set` مجموعه‌ای خاص است - «دسته‌ای از مقدارها» (بدون کلید) که هر مقدار تنها یک بار در آن واقع می‌شود. -Its main methods are: +متدهای اصلی آن: -- `new Set(iterable)` -- creates the set, and if an `iterable` object is provided (usually an array), copies values from it into the set. -- `set.add(value)` -- adds a value, returns the set itself. -- `set.delete(value)` -- removes the value, returns `true` if `value` existed at the moment of the call, otherwise `false`. -- `set.has(value)` -- returns `true` if the value exists in the set, otherwise `false`. -- `set.clear()` -- removes everything from the set. -- `set.size` -- is the elements count. +- `new Set(iterable)` -- set را ایجاد می‌کند و اگر یک شیء حلقه‌پذیر داده شود (معمولا یک آرایه)، مقدارها را از آن درون set کپی می‌کند. +- `set.add(value)` -- یک مقدار اضافه می‌کند و خود set را برمی‌گرداند. +- `set.delete(value)` -- مقدار را حذف می‌کند و اگر `value` هنگام فراخوانی وجود داشته باشد `true` را برمی‌گرداند، در غیر این صورت `false`. +- `set.has(value)` -- اگر مقدار در set وجود داشته باشد `true` را برمی‌گرداند، در غیر این صورت `false`. +- `set.clear()` -- همه چیز را از set حذف می‌کند. +- `set.size` -- برابر با تعداد المان‌ها است. -The main feature is that repeated calls of `set.add(value)` with the same value don't do anything. That's the reason why each value appears in a `Set` only once. +ویژگی اصلی این اصت که فراخوانی‌های پی‌در‌پی `set.add(value)` با مقداری یکسان، کاری انجام نمی‌دهد. به همین دلیل است که هر مقدار تنها یک بار در `Set` واقع می‌شوند. -For example, we have visitors coming, and we'd like to remember everyone. But repeated visits should not lead to duplicates. A visitor must be "counted" only once. +برای مثال، ما بازدیدکنندگانی داریم و می‌خواهیم همه افراد را به یاد بسپاریم. اما بازدیدهای تکراری نباید حساب شوند. یک بازدیدکننده باید تنها یک بار «شمرده شود». -`Set` is just the right thing for that: +`Set` ساختار کاملا مناسبی برای این کار است: ```js run let set = new Set(); @@ -257,47 +257,47 @@ let john = { name: "John" }; let pete = { name: "Pete" }; let mary = { name: "Mary" }; -// visits, some users come multiple times +// بازدیدها، بعضی از کاربران چندبار مراجعه می‌کنند set.add(john); set.add(pete); set.add(mary); set.add(john); set.add(mary); -// set keeps only unique values +// تنها مقدارهای یکتا را نگه می‌دارد set alert( set.size ); // 3 for (let user of set) { - alert(user.name); // John (then Pete and Mary) + alert(user.name); // John (Mary و Pete سپس) } ``` -The alternative to `Set` could be an array of users, and the code to check for duplicates on every insertion using [arr.find](mdn:js/Array/find). But the performance would be much worse, because this method walks through the whole array checking every element. `Set` is much better optimized internally for uniqueness checks. +جایگزین `Set` می‌تواند آرایه‌ای از کاربران و کدی برای بررسی تکراری بودن کاربر در هر بار اضافه کردن با استفاده از [arr.find](mdn:js/Array/find) باشد. اما عملکرد کد ممکن است بسیار بد باشد چون این متد تمام آرایه و هر المان را بررسی می‌کند. `Set` برای بررسی یکتا بودن از درون بسیار بهینه‌تر است. -## Iteration over Set +## حلقه‌زدن در Set -We can loop over a set either with `for..of` or using `forEach`: +ما می‌توانیم در set هم با `for..of` و هم با استفاده از `forEach` حلقه بزنیم: ```js run let set = new Set(["oranges", "apples", "bananas"]); for (let value of set) alert(value); -// the same with forEach: +// :forEach کار مشابه با استفاده از set.forEach((value, valueAgain, set) => { alert(value); }); ``` -Note the funny thing. The callback function passed in `forEach` has 3 arguments: a `value`, then *the same value* `valueAgain`, and then the target object. Indeed, the same value appears in the arguments twice. +یک چیز جالب را در نظر داشته باشید. تابعی که به `forEach` داده شده 3 آرگومان دارد: یک `value`، سپس *مقدار یکسان* `valueAgain` و سپس شیء مورد نظر. در واقع، مقداری یکسان دو بار در آرگومان ظاهر می‌شود. -That's for compatibility with `Map` where the callback passed `forEach` has three arguments. Looks a bit strange, for sure. But may help to replace `Map` with `Set` in certain cases with ease, and vice versa. +این به دلیل سازگاری با `Map` است که تابع داده شده به `forEach` دارای 3 آرگومان است. قطعا کمی عجیب به نظر می‌رسد. اما می‌تواند به جایگزینی `Map` با `Set` و برعکس در بعضی موارد کمک کند. -The same methods `Map` has for iterators are also supported: +همچنین متدهای مشابهی که `Map` هم برای حلقه‌زننده‌ها دارد، پشتیبانی می‌شوند: -- `set.keys()` -- returns an iterable object for values, -- `set.values()` -- same as `set.keys()`, for compatibility with `Map`, -- `set.entries()` -- returns an iterable object for entries `[value, value]`, exists for compatibility with `Map`. +- `set.keys()` -- یک شیء حلقه‌پذیر برای مقدارها را برمی‌گرداند، +- `set.values()` -- با `set.keys()` یکسان است، برای سازگاری با `Map` +- `set.entries()` -- یک شیء حلقه‌پذیر را برای اطلاعات به شکل `[value, value]` برمی‌گرداند، برای سازگاری با `Map` وجود دارد. ## Summary From 3a6e0ea17d929cb8d9237001fe971cc2eba7a8b3 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Thu, 29 Jul 2021 15:42:43 +0430 Subject: [PATCH 09/17] Translate article --- 1-js/05-data-types/07-map-set/article.md | 44 ++++++++++++------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index 9fdf718a0..55e625b48 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -299,34 +299,34 @@ set.forEach((value, valueAgain, set) => { - `set.values()` -- با `set.keys()` یکسان است، برای سازگاری با `Map` - `set.entries()` -- یک شیء حلقه‌پذیر را برای اطلاعات به شکل `[value, value]` برمی‌گرداند، برای سازگاری با `Map` وجود دارد. -## Summary +## خلاصه -`Map` -- is a collection of keyed values. +`Map` -- یک مجموعه از مقدارهای کلیددار است. -Methods and properties: +متدها و ویژگی‌های آن: -- `new Map([iterable])` -- creates the map, with optional `iterable` (e.g. array) of `[key,value]` pairs for initialization. -- `map.set(key, value)` -- stores the value by the key, returns the map itself. -- `map.get(key)` -- returns the value by the key, `undefined` if `key` doesn't exist in map. -- `map.has(key)` -- returns `true` if the `key` exists, `false` otherwise. -- `map.delete(key)` -- removes the value by the key, returns `true` if `key` existed at the moment of the call, otherwise `false`. -- `map.clear()` -- removes everything from the map. -- `map.size` -- returns the current element count. +- `new Map([iterable])` -- map را می‌سازد، برای مقداردهی اولیه از `iterable`(حلقه‌پذیر) اختیاری (مانند آرایه) از جفت‌های `[key,value]` می‌توان استفاده کرد. +- `map.set(key, value)` -- مقدار را به واسطه کلید ذخیره می‌کند، خود map را برمی‌گرداند. +- `map.get(key)` -- مقدار را به واسطه کلید برمی‌گرداند، اگر `key` در map وجود نداشته باشد `undefined` برمی‌گرداند. +- `map.has(key)` -- اگر `key` وجود داشته باشد `true` برمی‌گرداند، در غیر این صورت `false`. +- `map.delete(key)` -- مقدار را به واسطه کلید حذف می‌کند، اگر `key` در لحظه فراخوانی وجود داشته باشد `true` برمی‌گرداند، در غیر این صورت `false`. +- `map.clear()` -- همه چیز را از map حذف می‌کند. +- `map.size` -- تعداد المان‌ها را برمی‌گرداند. -The differences from a regular `Object`: +تفاوت آن با `Object` معمولی: -- Any keys, objects can be keys. -- Additional convenient methods, the `size` property. +- هر کلیدی ممکن است، شیءها هم می‌توانند کلید باشند. +- متدهای خوب بیشتر، ویژگی `size` -`Set` -- is a collection of unique values. +`Set` -- یک مجموعه از مقدارهای یکتا است. -Methods and properties: +متدها و ویژگی‌های آن: -- `new Set([iterable])` -- creates the set, with optional `iterable` (e.g. array) of values for initialization. -- `set.add(value)` -- adds a value (does nothing if `value` exists), returns the set itself. -- `set.delete(value)` -- removes the value, returns `true` if `value` existed at the moment of the call, otherwise `false`. -- `set.has(value)` -- returns `true` if the value exists in the set, otherwise `false`. -- `set.clear()` -- removes everything from the set. -- `set.size` -- is the elements count. +- `new Set([iterable])` -- set را ایجاد می‌کند، برای مقداردهی اولیه می‌توان از `iterable`(حلقه‌پذیر مانند آرایه) شامل مقدارها استفاده کرد. +- `set.add(value)` -- یک مقدار را اضافه می‌کند (اگر `value` وجود داشته باشد کاری نمی‌کند)، خود set را برمی‌گرداند. +- `set.delete(value)` -- مقدار را حذف می‌کند، اگر `value` هنگام فراخوانی وجود داشته باشد `true` را برمی‌گرداند، در غیر این صورت `false`. +- `set.has(value)` -- اگر مقدار در set وجود داشته باشد `true` را برمی‌گرداند، در غیر این صورت `false`. +- `set.clear()` -- همه چیز را از set حذف می‌کند. +- `set.size` -- برابر با تعداد المان‌ها است. -Iteration over `Map` and `Set` is always in the insertion order, so we can't say that these collections are unordered, but we can't reorder elements or directly get an element by its number. +حلقه‌زدن در `Map` و `Set` همیشه با ترتیب اضافه‌کردن انجام می‌شود، پس ما نمی‌توانیم بگوییم این مجموعه‌ها نامرتب هستند اما نمی‌توانیم المان‌ها را دوباره مرتب کنیم یا به صورت مستقیم یک المان را با استفاده از عدد آن دریافت کنیم. From a5ebd3e28269c54ad06902bed2e865cccdc11fc4 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Thu, 29 Jul 2021 15:47:23 +0430 Subject: [PATCH 10/17] Translate task of "array unique map" --- .../07-map-set/01-array-unique-map/task.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/1-js/05-data-types/07-map-set/01-array-unique-map/task.md b/1-js/05-data-types/07-map-set/01-array-unique-map/task.md index d68030032..8380e6442 100644 --- a/1-js/05-data-types/07-map-set/01-array-unique-map/task.md +++ b/1-js/05-data-types/07-map-set/01-array-unique-map/task.md @@ -2,17 +2,17 @@ importance: 5 --- -# Filter unique array members +# اعداد یکتای آرایه را جداسازی کنید -Let `arr` be an array. +فرض کنیم `arr` یک آرایه باشد. -Create a function `unique(arr)` that should return an array with unique items of `arr`. +تابع `unique(arr)` را بسازید که باید آرایه‌ای شامل المان‌های خاص `arr` را برگرداند. -For instance: +برای مثال: ```js function unique(arr) { - /* your code */ + /* کد شما */ } let values = ["Hare", "Krishna", "Hare", "Krishna", @@ -22,6 +22,6 @@ let values = ["Hare", "Krishna", "Hare", "Krishna", alert( unique(values) ); // Hare, Krishna, :-O ``` -P.S. Here strings are used, but can be values of any type. +پی‌نوشت: اینجا رشته‌ها استفاده شده‌اند اما می‌توانند هر مقداری از هر نوعی باشند. -P.P.S. Use `Set` to store unique values. +پی‌نوشت دوم: از `Set` برای ذخیره مقدارهای یکتا استفاده کنید. From e5310dd37904423f45c2cee4f4fc4a974ee92c3c Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Thu, 29 Jul 2021 15:52:39 +0430 Subject: [PATCH 11/17] Translate task of "filter anagrams" --- .../07-map-set/02-filter-anagrams/task.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/1-js/05-data-types/07-map-set/02-filter-anagrams/task.md b/1-js/05-data-types/07-map-set/02-filter-anagrams/task.md index 731fd2c25..25344282e 100644 --- a/1-js/05-data-types/07-map-set/02-filter-anagrams/task.md +++ b/1-js/05-data-types/07-map-set/02-filter-anagrams/task.md @@ -2,11 +2,11 @@ importance: 4 --- -# Filter anagrams +# واروواژه‌ها را جداسازی کنید -[Anagrams](https://en.wikipedia.org/wiki/Anagram) are words that have the same number of same letters, but in different order. +[واروواژه‌ها](https://fa.wikipedia.org/wiki/واروواژه) کلمه‌هایی هستند که تعداد برابری از حروف یکسان دارند اما با ترتیبی متفاوت. -For instance: +برای مثال: ``` nap - pan @@ -14,15 +14,15 @@ ear - are - era cheaters - hectares - teachers ``` -Write a function `aclean(arr)` that returns an array cleaned from anagrams. +یک تابع `aclean(arr)` بنویسید که آرایه‌ای پاک شده از واروواژه‌ها را برمی‌گرداند. -For instance: +برای مثال: ```js let arr = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"]; -alert( aclean(arr) ); // "nap,teachers,ear" or "PAN,cheaters,era" +alert( aclean(arr) ); // "nap,teachers,ear" یا "PAN,cheaters,era" ``` -From every anagram group should remain only one word, no matter which one. +از هر گروه واروواژه باید تنها یک کلمه بماند، مهم نیست کدام باشد. From 000c7709264b6948c9b6a278d9ef7fa3ab6c16c4 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Thu, 29 Jul 2021 16:05:38 +0430 Subject: [PATCH 12/17] Translate solution of "filter anagrams" --- .../07-map-set/02-filter-anagrams/solution.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/1-js/05-data-types/07-map-set/02-filter-anagrams/solution.md b/1-js/05-data-types/07-map-set/02-filter-anagrams/solution.md index d88d1d5db..732ebd51d 100644 --- a/1-js/05-data-types/07-map-set/02-filter-anagrams/solution.md +++ b/1-js/05-data-types/07-map-set/02-filter-anagrams/solution.md @@ -1,6 +1,6 @@ -To find all anagrams, let's split every word to letters and sort them. When letter-sorted, all anagrams are same. +برای پیدا کردن واروواژه‌ها، بیایید هر کلمه را به حروف آن تقسیم کنیم و مرتبش کنیم. زمانی که حروف مرتب شوند، تمام واروواژه‌ها یکسان هستند. -For instance: +برای مثال: ``` nap, pan -> anp @@ -9,14 +9,14 @@ cheaters, hectares, teachers -> aceehrst ... ``` -We'll use the letter-sorted variants as map keys to store only one value per each key: +ما از کلمه‌هایی که حروف آنها مرتب شده‌اند به عنوان کلید map استفاده می‌کنیم تا فقط یک مقدار را به ازای یک کلید ذخیره کنیم: ```js run function aclean(arr) { let map = new Map(); for (let word of arr) { - // split the word by letters, sort them and join back + // کلمه را به حروف آن تقسیم می‌کنیم، آنها را مرتب می‌کنیم و به یکدیگر پیوند می‌زنیم *!* let sorted = word.toLowerCase().split('').sort().join(''); // (*) */!* @@ -31,9 +31,9 @@ let arr = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"]; alert( aclean(arr) ); ``` -Letter-sorting is done by the chain of calls in the line `(*)`. +ترتیب‌بندی حروف با زنجیره‌ای از فراخوانی‌ها در خط `(*)` انجام می‌شود. -For convenience let's split it into multiple lines: +برای اینکه بهتر شود بیایید آن را به چند خط تقسیم کنیم: ```js let sorted = word // PAN @@ -43,21 +43,21 @@ let sorted = word // PAN .join(''); // anp ``` -Two different words `'PAN'` and `'nap'` receive the same letter-sorted form `'anp'`. +دو کلمه متفاوت `'PAN'` و `'nap'` کلمه یکسان `'anp'` که حروف آن مرتب شده است را دریافت می‌کنند. -The next line put the word into the map: +خط بعدی کلمه را درون map قرار می‌دهد: ```js map.set(sorted, word); ``` -If we ever meet a word the same letter-sorted form again, then it would overwrite the previous value with the same key in the map. So we'll always have at maximum one word per letter-form. +اگر ما هر زمانی دوباره کلمه‌ای با شکل یکسانی از حروف مرتب شده آن را ببینیم، سپس جایگزین مقدار قبلی می‌شود که کلید یکسانی در map دارد. پس ما همیشه حداکثر یک کلمه به ازای شکل مرتب شده آن داریم. -At the end `Array.from(map.values())` takes an iterable over map values (we don't need keys in the result) and returns an array of them. +در پایان `Array.from(map.values())` یک حلقه‌پذیر از مقدارهای map دریافت می‌کند (ما به کلیدها در نتیجه احتیاجی نداریم) و یک آرایه از آنها برمی‌گرداند. -Here we could also use a plain object instead of the `Map`, because keys are strings. +اینجا ما می‌توانستیم به جای `Map` از شیء ساده هم استفاده کنیم چون کلیدها رشته هستند. -That's how the solution can look: +راه حل ما اینگونه به نظر می‌رسد: ```js run function aclean(arr) { From c8582aad573eca424f1878edbfa210e0965f5033 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Thu, 29 Jul 2021 16:13:29 +0430 Subject: [PATCH 13/17] Translate task of "iterable keys" --- 1-js/05-data-types/07-map-set/03-iterable-keys/task.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/05-data-types/07-map-set/03-iterable-keys/task.md b/1-js/05-data-types/07-map-set/03-iterable-keys/task.md index 419763fbc..84cfb89c7 100644 --- a/1-js/05-data-types/07-map-set/03-iterable-keys/task.md +++ b/1-js/05-data-types/07-map-set/03-iterable-keys/task.md @@ -2,11 +2,11 @@ importance: 5 --- -# Iterable keys +# کلیدهای حلقه‌پذیر -We'd like to get an array of `map.keys()` in a variable and then apply array-specific methods to it, e.g. `.push`. +ما می‌خواهیم یک آرایه از `map.keys()` را دورن یک متغیر دیافت کنیم و سپس متدهای مخصوص آرایه را روی آن اعمال کنیم مانند `.push`. -But that doesn't work: +اما کار نمی‌کند: ```js run let map = new Map(); @@ -17,8 +17,8 @@ let keys = map.keys(); *!* // Error: numbers.push is not a function -keys.push("more"); +keys.push("بیشتر"); */!* ``` -Why? How can we fix the code to make `keys.push` work? +چرا؟ چگونه می‌توانیم کد را درست کنیم تا `keys.push` کار کند؟ From f2421c262aa695ebc75ae9c6400e254da52c3354 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Thu, 29 Jul 2021 16:15:14 +0430 Subject: [PATCH 14/17] Translate solution of "iterable keys" --- 1-js/05-data-types/07-map-set/03-iterable-keys/solution.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/07-map-set/03-iterable-keys/solution.md b/1-js/05-data-types/07-map-set/03-iterable-keys/solution.md index 7310d1d36..b6e004d78 100644 --- a/1-js/05-data-types/07-map-set/03-iterable-keys/solution.md +++ b/1-js/05-data-types/07-map-set/03-iterable-keys/solution.md @@ -1,7 +1,7 @@ -That's because `map.keys()` returns an iterable, but not an array. +دلیلش این است که `map.keys()` یک حلقه‌پذیر را برمی‌گرداند نه یک آرایه. -We can convert it into an array using `Array.from`: +ما می‌توانیم با استفاده از `Array.from` آن را به آرایه تبدیل کنیم: ```js run From fc02603b6d4e3a0bedb6c96bab6e6578d37fc533 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Thu, 29 Jul 2021 16:15:40 +0430 Subject: [PATCH 15/17] Revert translation of a word --- 1-js/05-data-types/07-map-set/03-iterable-keys/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/07-map-set/03-iterable-keys/task.md b/1-js/05-data-types/07-map-set/03-iterable-keys/task.md index 84cfb89c7..d6b370964 100644 --- a/1-js/05-data-types/07-map-set/03-iterable-keys/task.md +++ b/1-js/05-data-types/07-map-set/03-iterable-keys/task.md @@ -17,7 +17,7 @@ let keys = map.keys(); *!* // Error: numbers.push is not a function -keys.push("بیشتر"); +keys.push("more"); */!* ``` From 459f668a2ca39683b6f63f5948939e29de206c70 Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Fri, 30 Jul 2021 13:26:52 +0430 Subject: [PATCH 16/17] Apply suggestions from code review Co-authored-by: Mahdyar Hasanpour --- 1-js/05-data-types/07-map-set/02-filter-anagrams/solution.md | 4 ++-- 1-js/05-data-types/07-map-set/02-filter-anagrams/task.md | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/1-js/05-data-types/07-map-set/02-filter-anagrams/solution.md b/1-js/05-data-types/07-map-set/02-filter-anagrams/solution.md index 732ebd51d..188aa53e6 100644 --- a/1-js/05-data-types/07-map-set/02-filter-anagrams/solution.md +++ b/1-js/05-data-types/07-map-set/02-filter-anagrams/solution.md @@ -16,7 +16,7 @@ function aclean(arr) { let map = new Map(); for (let word of arr) { - // کلمه را به حروف آن تقسیم می‌کنیم، آنها را مرتب می‌کنیم و به یکدیگر پیوند می‌زنیم + // کلمه را به حروف آن تقسیم می‌کنیم، آنها را مرتب می‌کنیم و به یکدیگر متصل می‌کنیم *!* let sorted = word.toLowerCase().split('').sort().join(''); // (*) */!* @@ -33,7 +33,7 @@ alert( aclean(arr) ); ترتیب‌بندی حروف با زنجیره‌ای از فراخوانی‌ها در خط `(*)` انجام می‌شود. -برای اینکه بهتر شود بیایید آن را به چند خط تقسیم کنیم: +برای اینکه بهتر شود بیایید آن را به چندین خط تقسیم کنیم: ```js let sorted = word // PAN diff --git a/1-js/05-data-types/07-map-set/02-filter-anagrams/task.md b/1-js/05-data-types/07-map-set/02-filter-anagrams/task.md index 25344282e..9b5c59809 100644 --- a/1-js/05-data-types/07-map-set/02-filter-anagrams/task.md +++ b/1-js/05-data-types/07-map-set/02-filter-anagrams/task.md @@ -4,7 +4,7 @@ importance: 4 # واروواژه‌ها را جداسازی کنید -[واروواژه‌ها](https://fa.wikipedia.org/wiki/واروواژه) کلمه‌هایی هستند که تعداد برابری از حروف یکسان دارند اما با ترتیبی متفاوت. +[واروواژه‌ها](https://fa.wikipedia.org/wiki/واروواژه) کلمه‌هایی هستند که تعداد برابری از حروف یکسان دارند، اما با ترتیبی متفاوت. برای مثال: @@ -14,7 +14,7 @@ ear - are - era cheaters - hectares - teachers ``` -یک تابع `aclean(arr)` بنویسید که آرایه‌ای پاک شده از واروواژه‌ها را برمی‌گرداند. +یک تابع `aclean(arr)` بنویسید که آرایه‌ای تهی از واروواژه‌ها را برمی‌گرداند. برای مثال: @@ -25,4 +25,3 @@ alert( aclean(arr) ); // "nap,teachers,ear" یا "PAN,cheaters,era" ``` از هر گروه واروواژه باید تنها یک کلمه بماند، مهم نیست کدام باشد. - From ac3c902d8ef11312d9541c9b569634582ca67aaf Mon Sep 17 00:00:00 2001 From: MaHdi <72219881+mahdiHashemi14@users.noreply.github.com> Date: Fri, 30 Jul 2021 13:27:31 +0430 Subject: [PATCH 17/17] Update 1-js/05-data-types/07-map-set/article.md Co-authored-by: Mahdyar Hasanpour --- 1-js/05-data-types/07-map-set/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/07-map-set/article.md b/1-js/05-data-types/07-map-set/article.md index 55e625b48..f9d277355 100644 --- a/1-js/05-data-types/07-map-set/article.md +++ b/1-js/05-data-types/07-map-set/article.md @@ -123,7 +123,7 @@ for (let vegetable of recipeMap.keys()) { alert(vegetable); // cucumber, tomatoes, onion } -// در مقدارها حلقه بزن (میزان آنها) +// در مقدارها حلقه بزن (میزان آن‌ها) for (let amount of recipeMap.values()) { alert(amount); // 500, 350, 50 }