רג'קס - זיהוי חזרה של אותה אות (ליד תוים קבועים) מעל/מתחת כמות חזרות מסוימת
-
בהינתן לדוגמה מערך כזה של ערים (לכל עיר יש כמובן שדות מידע אמיתיים מלבד השם, אני החלפתי אותם במידע רנדומלי מסיבותיי וכיוון שהם לא רלוונטיים לשאלה):
const cities = [ { name: 'אופקים', info1: 'etfea', info2: 'qdkwc' }, { name: 'אחיסמך', info1: 'sxrez', info2: 'fqiln' }, { name: 'אילת', info1: 'zfish', info2: 'qzbzl' }, { name: 'אלעד', info1: 'ffobv', info2: 'ioydt' }, { name: 'אשדוד', info1: 'cfaei', info2: 'dncdz' }, { name: 'אשקלון', info1: 'wtmks', info2: 'jfjme' }, { name: 'באר יעקב', info1: 'asjju', info2: 'ymjxl' }, { name: 'באר שבע', info1: 'vvfkc', info2: 'dfynw' }, { name: 'בית שאן', info1: 'xkzkq', info2: 'varnr' }, { name: 'בית שמש', info1: 'dledu', info2: 'sbyvd' }, { name: 'ביתר עילית', info1: 'slsuh', info2: 'rluhh' }, { name: 'בני ברק', info1: 'zuxou', info2: 'voayu' }, { name: 'גבעת זאב', info1: 'tgcmh', info2: 'mozie' }, { name: 'גן יבנה', info1: 'izoqz', info2: 'xkbfd' }, { name: 'דימונה', info1: 'dviqq', info2: 'jtghy' }, { name: 'הרצליה', info1: 'ruzxq', info2: 'wpawt' }, { name: 'זכרון יעקב', info1: 'jlrqv', info2: 'zfyvy' }, { name: 'חדרה', info1: 'dbgbf', info2: 'mwzzi' }, { name: 'חולון', info1: 'mtaqw', info2: 'ffsnq' }, { name: 'חיפה', info1: 'iiiww', info2: 'rzhyd' }, { name: 'חריש', info1: 'xikeo', info2: 'ncblo' }, { name: 'טבריה', info1: 'ggbhh', info2: 'eorqr' }, { name: 'טלזסטון - קרית יערים', info1: 'pxuxk', info2: 'zpxxu' }, { name: 'ירוחם', info1: 'mczdy', info2: 'evanu' }, { name: 'ירושלים', info1: 'xunwb', info2: 'dlnrd' }, { name: 'כפר גדעון', info1: 'cosoj', info2: 'qffyk' }, { name: 'כרמיאל', info1: 'zlcel', info2: 'rbegx' }, { name: 'לוד', info1: 'mbbrx', info2: 'xxtef' }, { name: 'מגדל העמק', info1: 'evwci', info2: 'regub' }, { name: 'מודיעין עילית', info1: 'cachx', info2: 'jivjk' }, { name: 'מטולה', info1: 'xilhl', info2: 'tuuow' }, { name: 'מירון', info1: 'iegup', info2: 'mjedq' }, { name: 'מעלה אדומים', info1: 'qogvy', info2: 'fmfja' }, { name: 'מצפה רמון', info1: 'idrjo', info2: 'ixrnr' }, { name: 'נהריה', info1: 'wccxn', info2: 'rljmn' }, { name: 'נתיבות', info1: 'wafxa', info2: 'bbnkb' }, { name: 'נתניה', info1: 'idlib', info2: 'hdcvz' }, { name: 'עכו', info1: 'cpeuc', info2: 'szhoj' }, { name: 'עפולה', info1: 'dlhvp', info2: 'efhnq' }, { name: 'ערד', info1: 'pvaww', info2: 'kgxce' }, { name: 'פתח תקוה', info1: 'zmntv', info2: 'fkmzq' }, { name: 'צפת', info1: 'fkyjj', info2: 'ktgdm' }, { name: 'קרית אתא', info1: 'rkrnf', info2: 'nsgdf' }, { name: 'קרית גת', info1: 'bpncv', info2: 'ufjt' }, { name: 'קרית מלאכי', info1: 'zxywb', info2: 'bwqff' }, { name: 'קרית שמונה', info1: 'minjd', info2: 'djqxk' }, { name: 'ראש העין', info1: 'hzxxt', info2: 'mgxru' }, { name: 'ראשון לציון', info1: 'lppkq', info2: 'jvtxn' }, { name: 'רחובות', info1: 'ylmef', info2: 'bopbi' }, { name: 'רכסים', info1: 'fvlqk', info2: 'edxgi' }, { name: 'רמלה', info1: 'yrxiq', info2: 'uzxax' }, { name: 'רעננה', info1: 'taasg', info2: 'gkcuj' }, { name: 'תפרח', info1: 'wrkxj', info2: 'yhwaq' }, ]
אני רוצה לזהות לפי האות הראשונה בשדה
name
של כל עיר, את החזרה שלה. כלומר: אני רוצה לקבל לדוגמה את הרשימה של הערים שהאות שמתחילה את שמם חוזרת על עצמה מעל/מתחת כמות מסוימת. לדוגמה לפחות 6 פעמים (לדוגמה האות א').
לכאורה הדרך לעשות זאת זה על ידי חיפוש של האות הראשונה שאחרי כלname: '
, או אולי פשוט להריץ בדיקה על השדהname
בלבד עםfor
, ואז לפי האינדקס לשייך לאובייקט שבמיקום זה במערך?
מה הדרך, אם קיימת, לעשות זאת בקלות?
(ייתכן שבכזה מערך קצר יחסית כבר עדיף לבדוק זאת ידנית, אבל מעניין אותי לדעת כזה דבר לפעמים אחרות... )
תודה! -
@dovid לכן הסברתי:
לכאורה הדרך לעשות זאת זה על ידי חיפוש של האות הראשונה שאחרי כל name: '
לזה התכוונתי אחרי תו קבוע. אבל אחרי זה חשבתי שזה מיותר -
או אולי פשוט להריץ בדיקה על השדה name בלבד עם for, ואז לפי האינדקס לשייך לאובייקט שבמיקום זה במערך?
@dovid אמר ברג'קס - זיהוי חזרה של אותה אות (ליד תוים קבועים) מעל/מתחת כמות חזרות מסוימת:
יש מצב שתביא דוגמה של הפלט הרצוי לקלט נתון?
לדוגמה אם אני רוצה לקבל את האותיות שפחות מ2 ערים מתחילות בהן, אז זה:
ד, ז, ל
, וכולי, שבכל אחת מהאותיות האלו יש רק עיר אחת ברשימה הזו -
@צדיק-תמים מצד אחד לחפש כמה ערים מתחילים בג', וגם המילים for ואינדקס ומערך זה משימה של קוד זמן ריצה, מצד שני חיפוש אחרי ה
name: '
נשמע כמו חיפוש והחלפה בעורך קוד, אני מבולבל עמוקות. אני מקוה שאתה לא חושב שבאבייקט JS האות של מחרוזת "נמצאת ליד" התו האחרון של שם המאפיין שמחזיק אותה (name)! -
@dovid שאלתי על שתי הדרכים - האם נכון לעשות זאת ברג'קס, כשכוונתי בחיפוש לפי name היא אם עושים חיפוש בהתייחסות לאובייקט כמחרוזת טקסט ולא כאובייקט, או אולי בקוד זמן ריצה על ידי לולאה. כעת אני אוחז שזה לא הגיוני לעשות את זה ברג'קס, השאלה האם זה בכלל אפשרי ברג'קס? מקווה שכעת הייתי מספיק ברור, אם לא אני מתנצל מראש
-
@צדיק-תמים תבדוק מה מתאים לך:
const lettersCount = cities.reduce((x, item) => { x[item.name[0]] = (x[item.name[0]] || 0) + 1; return x; }, {})
או:
const grouped = {} cities.forEach(x => { grouped[x.name[0]] = grouped[x.name[0]] || []; grouped[x.name[0]].push(x.name); });
-
הפתרון שלי נקודתי מידי, כדאי לאמץ שימוש במתודה groupby מעיו זו (מקור) :
function groupBy(list, keyGetter) { const map = new Map(); for (const item of list) { const key = keyGetter(item); const collection = map.get(key); if (!collection) map.set(key, [item]); else collection.push(item); } return map; }
ואז זה קוד יפה:
const grouped = groupBy(cities, x=> x.name[0]); console.log(grouped.get('א'));