בניית טופס רכישה לפי אותיות
-
אני בונה טופס בחירת אותיות, לפי שם, יש לי מאגר של אותיות, ואנשים בוחרים אותיות לפי השם שלהם, למשל 'דוד' אז יוריד לי 2 מהסך של אות ד', ו-1 מהסך של ו'.
אשמח לקבל רעיון איך לבנות את זה.
האם לקבל את המחרוזת ולבצע חיפוש על כל האותיות אם קיימות במחרוזת וכמה, ואז לבצע חישוב.
נראה לי ארוך מידי, או שהדרך היחידה לעשות שדה קלט לכל אות בנפרד.
אשמח לרעיון. או קוד. תודהה -
@אבי-203 לא הבנתי לגמרי את השאלה.
אני מבין שאתה לוקח למשל את כל ספר התורה, ומוכר לאנשים אותיות. ואתה רוצה לשמור את המכירה - כלומר שיש פחות מאות פלונית.
אם הבנתי נכון, אתה עושה חד פעמית ספירה של כל האותיות.
ויוצר אובייקט כזה:var allLeteres = {48646, "y": 152896 :"x", ...}
וכן הלאה.
אחרי קניה, אתה עושהallLeters["א"] -=1;
הנה קוד שמתאר את העניין:
var source = "פה יש את טקסט של כל התורה...."; var allLeters = {}; [...source].forEach(x => allLeters[x] = 1 + (allLeters[x] || 0)); function subLetters(word){ for(var l of word){ if(!allLeters[l]) throw "אין מספיק אותיות..."; allLeters[l] -= 1; } } //allLeters //{פ: 1, ה: 3, " ": 6, י: 1, ש: 2, …} subLetters("טסט")
נ.ב. מה תעשה כשיישאר אלפי אותיות ו,י בסוף ללא אותיות נוספות, מישהו יקנה?
-
@אבי-203 תזכור להוריד אותיות לא חוקיות מהקלט (או שתדאג שהם לא יופיעו באוביקט
allLeters
), לדוגמה רווחים... (אולי תקבץ ביחד אותיות סופיות ביחד עם האות הלא-סופית)
@dovid לפרוס את כל התורה כולה לתוך מערך נשמע לא כל כך יעיל. אבל פעם אחת למי איכפת...
אני מאמין שזה יותר יעיל:for (i=0;i<source.length;i++) { x = source[i]; allLeters[x] = 1 + (allLeters[x] || 0)); }
עריכה: לא צדקתי... http://jsben.ch/GnbDe
עריכה2: סליחה, זה משהו אחר שם... הנה: http://jsben.ch/bqrRx (אבל יש שם באג בדף וזה לא מראה את התוצאות, למעשה הקוד שלי כ-70% משל @dovid )נ.ב. למה מופיע
{1}
אחרי הקוד שלי? זה לא נמצא במקור. -
קודם כל תודה חברים.
מה הסיבה שאתם ממליצים על אובייקט? וגם להכניס את כל הטקסט של התורה?
אני חשבתי על כיון בניתי במסד נתונים טבלה עם כל המידע לכל אות כמה יש אותה בתורה. ואז אם 'דוד' השם שנקנה אז ירד מהאותיות הללו, בלי כל התייחסות מדוייקת לאיפה האות ממוקמת בתורה.מה נעשה עם היתרות? ת. אני עושה את זה שיראו כמה נשאר מכל אות, ואז שיתאימו את עצמם, בנוסף יהיה אופציה אות אקראית ואז אקח ממי שנשאר הכי הרבה..
נ.ב הנה הפירוט המדוייק (מצאתי באיזה מקום..)
א 27057
ב 16344
ג 2109
ד 7032
ה 28052
ו 30513
ז 2198
ח 7187
ט 1802
י 31530
כ+ך 11940
ל 21570
מ+ם 25095
נ+ן 14141
ס 1833
ע 11247
פ+ף 4809
צ+ץ 3982
ק 4694
ר 18125
ש 15596
ת 17949
סכ"ה - 304805 -
@yossiz אמר בבניית טופס רכישה לפי אותיות:
@dovid לפרוס את כל התורה כולה לתוך מערך נשמע לא כל כך יעיל. אבל פעם אחת למי איכפת...
לא התכוונתי שיעשה את זה ככה לכל התורה, זה רק המחשה להמשך.
בשביל לעשות בפועל צריך לקרוא קובץ עם זרם ולעדכן את האובייקט.
(כנ"ל בקשר לייעול של for על הforEach ברור שfor אמור להיות מהר יותר (לא בדקתי את המ"מ) אבל לא חלמתי לעשות את זה בפועל לא בזה ולא בזה). -
@dovid @yossiz
מתקדם ומתקשה. תודה.
שאלה בהקדים.
בשביל לבצע שינוי בשדה מסויים אני חייב פילטר או אפשר להפנות עם תנאי במקום query
כלומר שמתי את האותיות במסד נתונים, עם העמודות הבאות: שם האות, וכמות [ועוד אחד עותק של הכמות שלא ישתנה]
אני חייב לבצע query שיסנן את הטבלה התואמת לאות שצווינה, ואז יוריד מהכמות אחד, או אפשר לכתוב ישר הורד אחד מהכמות של האות המתאימה.
מקווה שהצלחתי להסביר.וגם זה משום מה לא עובד לי, הוא מוריד רק 1 גם אם אותה האות מוזכרת פעמים, למשל 'אבא' הוא מוריד 1 א' ואחד ב'. איפה טעיתי?
function subLetters(word){ for(var l of word){ console.log(l); wixData.query("ot") .contains('ot', l) .find() .then( (results) => { let itemupdate = results.items[0].ms - 1; console.log(itemupdate); let item = results.items[0]; item.ms = itemupdate; console.log(item); wixData.update("ot", item); } } ) .catch( (err) => { let errorMsg = err; } ); } }
-
@אבי-203 אמר בבניית טופס רכישה לפי אותיות:
מצורף. תודה.
לשם 'אבא'}
![alt text](ima ge url)
export function postData(word){ for(var l of word){ console.log(l); wixData.query("ot") .contains('ot', l) .find() .then( (results) => { let itemupdate = results.items[0].ms - 1; console.log(itemupdate); if(itemupdate > 0) { let item = results.items[0]; item.ms = itemupdate; console.log(item); wixData.update("ot", item); } else { console.log("נגמר האות, חפש אות אחרת או אות אקראית"); } } ) .catch( (err) => { let errorMsg = err; } ); } return; }
-
אוקי הבעיה פשוטה.
בלולאה שעוברת על הלולאות יש קריאה לDB שקוראת מה הסכום הנוכחי.
שמים את הסכום במשתנה - 1, ומעדכנים.
כעת העדכון לא מיידי, כך ששתי הקריאות לא' נעשים לפני העדכון הראשון.
יש כמה דרכים להתמודד עם זה, לי נראה הכי יעיל לרכז לפני העדכון את מספר האותיות שיש להסיר:export function postData (word) { var lettersToSub = {}; for (var l of word) lettersToSub[l] = 1 + (lettersToSub[l] || 0); for (var ot in lettersToSub) { wixData.query("ot") .contains('ot', ot) .find() .then((results) => { let itemupdate = results.items[0].ms - lettersToSub[ot]; if (itemupdate >= 0) { let item = results.items[0]; item.ms = itemupdate; wixData.update("ot", item); } else console.log("נגמר האות, חפש אות אחרת או אות אקראית"); }).catch(console.log); } return; }
-
תנסה את הקוד הבא, ואם זה נכשל תביא את הפלט של הקונסול.
export function postData (word) { var lettersToSub = {}; for (var l of word) lettersToSub[l] = 1 + (lettersToSub[l] || 0); for (var ot in lettersToSub) { console.log(ot, lettersToSub[ot]); wixData.query("ot") .contains('ot', ot) .find() .then((results) => { let itemupdate = results.items[0].ms - lettersToSub[ot]; if (itemupdate >= 0) { let item = results.items[0]; item.ms = itemupdate; return wixData.update("ot", item) .then(x => console.log(x[0].ms, x[0].ot)); } else console.log("נגמר האות, חפש אות אחרת או אות אקראית"); }).catch(console.log); } return; }
-
@dovid אמר בבניית טופס רכישה לפי אותיות:
export function postData (word) { var lettersToSub = {}; for (var l of word) lettersToSub[l] = 1 + (lettersToSub[l] || 0); for (var ot in lettersToSub) { console.log(ot, lettersToSub[ot]); wixData.query("ot") .contains('ot', ot) .find() .then((results) => { let itemupdate = results.items[0].ms - lettersToSub[ot]; if (itemupdate >= 0) { let item = results.items[0]; item.ms = itemupdate; return wixData.update("ot", item) .then(x => console.log(x[0].ms, x[0].ot)); } else console.log("נגמר האות, חפש אות אחרת או אות אקראית"); }).catch(console.log); } return; }
ואוו!!!
עובד נהדר!
מה סידרת לא תפסתי.