testsAndMisc/python_pkg/js_anki/extras.json
Krzysztof kuhy Rudnicki c54a1d40c7 js_anki: prettier-format card data
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-04 22:45:03 +02:00

253 lines
9.2 KiB
JSON

[
{
"method": "Map get/set/has",
"tier": "core",
"task": "Store and read key/value pairs in a Map",
"call": "m.set(k, v); m.get(k); m.has(k); m.size",
"mutates": true,
"returns": "set() returns the Map (chainable); get() returns undefined if missing",
"example": "const m=new Map(); m.set('a',1); return [m.get('a'),m.get('b'),m.has('a'),m.size];",
"expected": "[1,null,true,1]",
"gotcha": "size is a property, not a method. Map keeps insertion order and allows any key type."
},
{
"method": "Map delete",
"tier": "core",
"task": "Delete a key from a Map",
"call": "m.delete(k)",
"mutates": true,
"returns": "true if the key existed, else false",
"example": "const m=new Map([['a',1]]); return [m.delete('a'),m.delete('a'),m.size];",
"expected": "[true,false,0]"
},
{
"method": "Map counter",
"tier": "core",
"task": "Count frequencies with a Map",
"call": "m.set(c, (m.get(c) ?? 0) + 1)",
"mutates": true,
"returns": "(idiom)",
"example": "const m=new Map(); for (const c of 'aab') m.set(c,(m.get(c)??0)+1); return [...m];",
"expected": "[[\"a\",2],[\"b\",1]]"
},
{
"method": "Map iterate",
"tier": "core",
"task": "Loop over a Map's key/value pairs",
"call": "for (const [k, v] of m) { ... } // m.keys(), m.values() too",
"returns": "iterates [key, value] pairs in insertion order",
"example": "const out=[]; for (const [k,v] of new Map([['a',1],['b',2]])) out.push(k+v); return out;",
"expected": "[\"a1\",\"b2\"]"
},
{
"method": "Set basics",
"tier": "core",
"task": "Track unique values in a Set",
"call": "const s = new Set(arr); s.add(x); s.has(x); s.delete(x); s.size",
"mutates": true,
"returns": "add() returns the Set; has()/delete() return boolean",
"example": "const s=new Set([1,2,2,3]); s.add(4); return [s.size,s.has(2),s.delete(9)];",
"expected": "[4,true,false]"
},
{
"method": "Set dedupe",
"tier": "core",
"task": "Remove duplicates from an array",
"call": "[...new Set(arr)]",
"mutates": false,
"returns": "new array, first-seen order",
"example": "return [...new Set([3,1,3,2,1])];",
"expected": "[3,1,2]"
},
{
"method": "Object.entries",
"tier": "core",
"task": "Get [key, value] pairs of an object",
"call": "Object.entries(obj) // Object.keys / Object.values",
"mutates": false,
"returns": "array of [key, value]",
"example": "return Object.entries({a:1,b:2});",
"expected": "[[\"a\",1],[\"b\",2]]",
"gotcha": "Integer-like keys come first in ascending order, regardless of insertion."
},
{
"method": "Object.fromEntries",
"tier": "core",
"task": "Build an object from [key, value] pairs",
"call": "Object.fromEntries(pairs)",
"mutates": false,
"returns": "new object",
"example": "return Object.fromEntries([['a',1],['b',2]]);",
"expected": "{\"a\":1,\"b\":2}",
"gotcha": "Works with a Map too: Object.fromEntries(map)."
},
{
"method": "Object counter",
"tier": "core",
"task": "Count frequencies with a plain object",
"call": "o[c] = (o[c] || 0) + 1",
"mutates": true,
"returns": "(idiom)",
"example": "const o={}; for (const c of 'aab') o[c]=(o[c]||0)+1; return o;",
"expected": "{\"a\":2,\"b\":1}",
"gotcha": "Keys become strings; prefer Map when keys are numbers or you need .size."
},
{
"method": "Math.max / Math.min",
"tier": "core",
"task": "Max / min of an array",
"call": "Math.max(...arr)",
"mutates": false,
"returns": "number; Math.max() is -Infinity, Math.min() is Infinity",
"example": "return [Math.max(...[1,5,3]),Math.min(...[1,5,3])];",
"expected": "[5,1]",
"gotcha": "Spread of ~100k+ items overflows the stack; use a loop or reduce."
},
{
"method": "Infinity sentinel",
"tier": "core",
"task": "Initialize a running min / max",
"call": "let best = Infinity; // or -Infinity for max",
"returns": "(idiom)",
"example": "let best=Infinity; for (const x of [4,2,8]) best=Math.min(best,x); return best;",
"expected": "2"
},
{
"method": "Math.floor / trunc",
"tier": "core",
"task": "Integer division (and negatives)",
"call": "Math.floor(a / b) // Math.trunc rounds toward 0",
"returns": "number",
"example": "return [Math.floor(-7/2),Math.trunc(-7/2),Math.floor(7/2)];",
"expected": "[-4,-3,3]",
"gotcha": "Floor and trunc differ for negatives. Math.round(-2.5) is -2 (ties go toward +∞)."
},
{
"method": "Math.ceil / round / abs / sqrt / pow",
"tier": "core",
"task": "Ceil, round, absolute value, square root, power",
"call": "Math.ceil(x); Math.round(x); Math.abs(x); Math.sqrt(x); x ** n",
"returns": "number",
"example": "return [Math.ceil(2.1),Math.round(2.5),Math.abs(-3),Math.sqrt(16),2**10];",
"expected": "[3,3,3,4,1024]"
},
{
"method": "parseInt / Number",
"tier": "core",
"task": "Convert a string to a number",
"call": "parseInt(s, 10) // Number(s) for strict",
"returns": "number (NaN on failure)",
"example": "return [parseInt('42px',10),String(Number('42px'))];",
"expected": "[42,\"NaN\"]",
"gotcha": "parseInt is lenient (stops at the first bad char); Number is strict. Always pass the radix."
},
{
"method": "toString(radix) / parseInt(s, radix)",
"tier": "core",
"task": "Convert between decimal and binary (or another base)",
"call": "n.toString(2); parseInt(s, 2)",
"returns": "string / number",
"example": "return [(5).toString(2),parseInt('101',2)];",
"expected": "[\"101\",5]"
},
{
"method": "Bit operations",
"tier": "core",
"task": "Shift, mask, XOR, and shift-left bit tricks",
"call": "n >> 1; n & 1; a ^ b; 1 << k",
"returns": "32-bit signed integer",
"example": "return [7>>1,7&1,5^3,1<<3];",
"expected": "[3,1,6,8]",
"gotcha": "Bitwise ops work on 32-bit signed ints: above 2^31 use BigInt. >>> 0 gives unsigned."
},
{
"method": "Sort numbers asc/desc",
"tier": "core",
"task": "Sort numbers ascending and descending",
"call": "arr.sort((a, b) => a - b) // desc: b - a",
"returns": "the SAME array, sorted in place",
"example": "const a=[3,1,2]; return [[...a].sort((x,y)=>x-y),[...a].sort((x,y)=>y-x)];",
"expected": "[[1,2,3],[3,2,1]]",
"gotcha": "The comparator returns a number, not a boolean: (a, b) => a > b misbehaves."
},
{
"method": "Sort by two keys",
"tier": "core",
"task": "Sort pairs by the first value, then by the second",
"call": "arr.sort((a, b) => a[0] - b[0] || a[1] - b[1])",
"returns": "the SAME array, sorted in place",
"example": "return [[2,1],[1,5],[1,2]].sort((a,b)=>a[0]-b[0]||a[1]-b[1]);",
"expected": "[[1,2],[1,5],[2,1]]",
"gotcha": "0 is falsy, so || falls through to the next key only on ties."
},
{
"method": "Sort strings by length",
"tier": "core",
"task": "Sort strings by length",
"call": "arr.sort((a, b) => a.length - b.length)",
"returns": "the SAME array, sorted in place",
"example": "return ['ccc','a','bb'].sort((a,b)=>a.length-b.length);",
"expected": "[\"a\",\"bb\",\"ccc\"]"
},
{
"method": "Swap with destructuring",
"tier": "core",
"task": "Swap two variables (or array slots) without a temp",
"call": "[a, b] = [b, a] // [arr[i], arr[j]] = [arr[j], arr[i]]",
"returns": "(idiom)",
"example": "let a=1,b=2; [a,b]=[b,a]; return [a,b];",
"expected": "[2,1]",
"gotcha": "The previous line must end with a semicolon or ASI joins them."
},
{
"method": "Array destructuring + rest",
"tier": "core",
"task": "Split off the first element and keep the rest",
"call": "const [first, ...rest] = arr",
"returns": "(idiom)",
"example": "const [first,...rest]=[1,2,3]; return [first,rest];",
"expected": "[1,[2,3]]"
},
{
"method": "Spread copy",
"tier": "core",
"task": "Copy an array / append without mutating",
"call": "const b = [...a, x]",
"mutates": false,
"returns": "new array (SHALLOW copy)",
"example": "const a=[1,2]; const b=[...a,3]; return [b,a];",
"expected": "[[1,2,3],[1,2]]",
"gotcha": "Nested arrays are still shared. For 2D grids: grid.map((r) => [...r])."
},
{
"method": "Object destructuring + rest",
"tier": "core",
"task": "Pull one field out of an object and keep the rest",
"call": "const { a, ...rest } = obj",
"returns": "(idiom)",
"example": "const {a,...r}={a:1,b:2,c:3}; return [a,r];",
"expected": "[1,{\"b\":2,\"c\":3}]"
},
{
"method": "structuredClone",
"tier": "core",
"task": "Deep-copy a nested array/object",
"call": "structuredClone(x)",
"mutates": false,
"returns": "deep copy",
"example": "const a=[[1]]; const b=structuredClone(a); b[0][0]=9; return a;",
"expected": "[[1]]",
"gotcha": "Throws on functions. JSON.parse(JSON.stringify(x)) loses undefined/Map/Set."
},
{
"method": "?? vs ||",
"tier": "core",
"task": "Default a value only when null/undefined (not for 0)",
"call": "x ?? fallback",
"returns": "x unless it is null/undefined",
"example": "return [0||5,0??5];",
"expected": "[5,0]",
"gotcha": "|| also replaces 0, '' and false; ?? only replaces null and undefined."
}
]