Un Front end engineer si occupa dell'esperienza utente di un software o di un'app. Durante un colloquio, dovrai dimostrare di comprendere i principi del UX/UI design, di voler contribuire alla realizzazione di un codice ottimizzato per l'offerta di prodotti e di voler collaborare con i back-end engineer alla risoluzione dei problemi. Aspettati domande sulla tua esperienza tecnica e di design, nonché sulle tue competenze di gestione dei membri del team.
Ecco le 3 domande più frequenti nei colloqui di lavoro per Front end engineer e consigli su come rispondere:
Come rispondere: Descrivi quali strumenti e metodologie usi durante lo sviluppo di un prodotto. Parla delle strategie che usi per lavorare con un'ampia varietà di stakeholder, tra cui clienti, reparto vendite e marketing e back-end engineer. Usa esempi specifici per mostrare come il tuo flusso di lavoro ha avuto successo ed esprimi anche la volontà di adattarti e cambiare se necessario.
Come rispondere: Gran parte del ruolo di Front end engineer riguarda quei dettagli minuziosi che rendono fluida l'esperienza dell'utente. Evidenzia che capisci l'importanza di un codice pulito e corretto, dei protocolli di test e della gestione delle versioni. Usa esempi di metodologie che hai implementato e fornisci dettagli sui problemi che sei stato in grado di gestire o risolvere.
Come rispondere: Una domanda come questa ti offre l'opportunità di dimostrare che sei appassionato di ingegneria front end. Spiega come integri il design centrato sull'utente nei tuoi progetti e le filosofie a cui ti ispiri. Specifica i libri o gli articoli che hai letto e di cui hai apprezzato i contenuti. Se possibile, parla dei cambiamenti che prevedi e di come secondo te il design e la tecnologia si adatteranno a questi cambiamenti.
↳
Essentially the same as Anh's answer but less code, assuming ES5 is available var arr = ["a","b","c","d","e","f"]; var indices = [2, 3, 4, 0, 5, 1]; arr = indices.map(function (item, index) { return arr[indices.indexOf(index)]; }); Meno
↳
function reposition(arr, indices) { var newArr = []; // I'm not sure if extra space is allowed. If it is, the solution should be this simple. for(var i = 0; i < arr.length; ++i) { var newIndex = indices[i]; newArr[newIndex] = arr[i]; } return newArr; } var arr = ["a", "b", "c", "d", "e", "f"]; var indices = [2, 3, 4, 0, 5, 1]; reposition(arr, indices); // returns: ["d", "f", "a", "b", "c", "e"] Meno
↳
function repositionElements(arr, indices) { // assert(arr.length === indices.length) var moved = []; for (var i = 0; i < arr.length; i++) { moved.push(false); } var moveFrom, moveTo, itemToMove; for (moveFrom = 0; moveFrom < arr.length; moveFrom++) { itemToMove = arr[moveFrom]; while (!moved[moveFrom]) { moveTo = indices[moveFrom]; var tmpItem = arr[moveTo]; arr[moveTo] = itemToMove; itemToMove = tmpItem; moved[moveFrom] = true; moveFrom = moveTo; } } return arr; } var arr = ["a", "b", "c", "d", "e", "f"], indices = [2, 3, 4, 0, 5, 1]; repositionElements(arr, indices); // returns: ["d", "f", "a", "b", "c", "e"] Meno
↳
I agree with converting the excludes to an object, but in order to get linear performance that doesn't depend on the number of excluded things, you have to concatenate the k and v into one value to be used as the key in the object: let excludesObject = {}; excludes.forEach(pair => excludesObject[`${pair.k}_${pair.v}`] = true); Then you can check if an item should be excluded in O(k) time where k is the number of keys in an item. And the whole thing will run in O(nk) where n is the number of items. // if there is some key which is found in the excludesObject, the filter will return false items = items.filter(item => !Object.keys(item).some(key => excludesObject[`${key}_${item[key]}`]); ); Facebook, hire me! lol Meno
↳
function excludeItems(items, excludes) { let excludesMap = excludes.reduce((entry, result)=>{ entry[result.k + result.v] = true; return entry; },{}); return items.reduce( (result, item) => { let updatedObject = Object.keys(item).reduce( (result,key) => { if(!excludesMap[key + item[key]]){ result[key] = item[key] } return result; }, {}) result.push(updatedObject) return result; }, []) } Meno
↳
This solution will give much faster and immutable result. You can test with performance.now items.reduce((allItems, item) => { if(!excludes.some(exclude=>item[exclude.k] === exclude.v)){ allItems.push(item); } return allItems; }, []); Meno
↳
ary.join().split(',');
↳
array.toString().split(',').map(Number), map need because input array has only integer types. Meno
↳
var flatten = function(arr, resultArr) { var result = resultArr || []; for(var i = 0; i < arr.length; i++) { if(Array.isArray(arr[i])) { flatten(arr[i], result); } else { result.push(arr[i]); } } return result; }; Meno
↳
as there are 21 characters and you describe a grid, I'm assuming it's 3x7: I B C A L K A D R F C A E A G H O E L A D Starting from the upper left and moving SE till a wall, then moving NE, then moving SE yields IROCLED, not IROCKA. However my human-powered fuzzy search is telling me it's much more likely that the answer is IROCKED, so I'm wondering whether the 1. author misremembered the original grid 2. the author misremembered the correct answer and the grid 3. I misunderstood the question. Meno
↳
var arr = [ ['I','B','C','A','L','K','A'], ['D','R','F','C','A','E','A'], ['G','H','O','E','L','A','D'] ]; var row = 0, col = 0; var totalCols = arr[0].length; var totalRows = arr.length; var msg = ''; while (col < totalCols) { msg += arr[row][col]; // row++ if less than total rows // row-- if back at row 0 row = (row === 0 || row < totalRows - 1) ? row + 1 : row - 1; // always go forward in column col++; } // returns 'IROCLED' Meno
↳
All solutions in here are wrong as they never go back up to the 0th row after first descent. ``` var arr = [ ['I','B','C','A','K','E','A'], ['D','R','F','C','A','E','A'], ['G','H','O','E','L','A','D'] ]; var row = 0, col = 0; var totalCols = arr[0].length; var totalRows = arr.length; var goingDown = false; var msg = ''; while (col < totalCols) { msg += arr[row][col]; // row++ if less than total rows // row-- if back at row 0 if (row === 0 || (row < totalRows - 1 && goingDown)) { row += 1; goingDown = true; } else { row -= 1; goingDown = false; } // always go forward in column col++; } console.log(msg) // IROCKED ``` Meno
↳
function flatten(input) { return (input || []).reduce(function (prev, current) { if (Array.isArray(current)) { return prev.concat(flatten(current)); } else { prev.push(current); return prev; } }, []); } Meno
↳
function flattenRecursive( a, ret ) { return a.reduce((ret, cur) => { if (Array.isArray(cur)) { flattenRecursive(cur, ret); } else if(typeof cur !== 'object'){ ret.push(cur); } return ret; }, ret || []) } function flattenIterative( a ) { let ret = []; while( a.length ) { let cur = a.pop(); if (Array.isArray(cur)) { a = [...a, ...cur]; } else if ( typeof cur !== 'object' ){ ret.push(cur) } } return ret.reverse(); } Meno
↳
let flat = (z = []) => { return !Array.isArray(z) ? [].concat(z) : (z.length > 0) ? flat(z.splice(0, 1)[0]).concat(flat(z)) : z } Meno
↳
Management
↳
Social media experience
↳
I am technically sound in using R script for R programming language, base SAS, SAS analytics and Advanced SAS. Meno
↳
Since node is object we can store value directly on the node itself. But it become complex and may mess with original object. Luckily we have Symbol come to rescue: class DOMStore { constructor () { this.DOMStoreSymbol = Symbol('DOMStore'); } has (node) { return node[this.DOMStoreSymbol] !== undefined; } set (node, value) { node[this.DOMStoreSymbol] = value; } get (node, defaultValue) { return node[this.DOMStoreSymbol] || defaultValue; } } const e1 = document.createElement('A'); const e2 = document.createElement('P'); const e3 = document.createElement('DIV'); const e4 = document.createElement('TABLE'); const e5 = document.createElement('A'); const map1 = new DOMStore(); const map2 = new DOMStore(); console.assert(map1.has(e1) === false, 'map1 should be empty'); map1.set(e1, 'E1 in map1'); console.assert(map1.has(e1) === true, 'map1 must have e1'); map2.has(e1); console.assert(map2.has(e1) === false, 'map2 should be empty'); map1.set(e2, 1234); map1.set(e3, "String"); map1.set(e4, [1,2,3,4]); console.assert(map1.get(e5, null) === null); console.assert(map1.get(e5) === undefined); console.assert(map1.get(e5, 5) === 5); map1.set(e5, {1: 2, 3: 4}); console.assert(map1.get(e1) === 'E1 in map1'); console.assert(typeof(map1.get(e5)) === 'object'); Meno
↳
Are you able to elaborate on this question? Can each node have multiple values or just 1? The way I interpret what you have written, it just sounds like they are asking for an ES6 Map? ES6 Maps can have objects as keys, so you can use the Node as the key. If you had to code it from scratch without the use of an ES6 Map, something like: class CachedNode { constructor(node, value) { this._node = node; this._value = value; } getNode() { return this._node; } getValue() { return this._value; } setValue(value) { this._value = value; return this; } } class SimpleStore { constructor() { this._container = []; } set(node, value) { let cachedNode; if (this.has(node)) { cachedNode = this.get(node); cachedNode.setValue(value); } else { cachedNode = new CachedNode(node, value); this._container.push(cachedNode); } return this; } // you might want to change this method so it returns the Node's value not the CachedNode. // If you did, that would mean adding another method to get the CachedNode. Easy enough. get(node) { return this._container.find((cachedNode) => { return cachedNode.getNode() === node; }); } has(node) { return !!this.get(node); } } If it needed to store multiple values against a node, then just change the single value for a Set or Array. Meno
↳
The tricky part of the question was on how to store a DOM Node which is an object as an old javascript object key. I can't recall was it about 1 to 1 relationship or 1 to many, but it is really doesn't matter because the later gives just a small overhead. I suppose your solution is pretty what they were expected from the task, starting from explaining ES6 Map and ending up with an old javascript solution. Meno
↳
let endorsements = [ { skill: 'css', user: 'Bill' }, { skill: 'javascript', user: 'Chad' }, { skill: 'javascript', user: 'Bill' }, { skill: 'css', user: 'Sue' }, { skill: 'javascript', user: 'Sue' }, { skill: 'html', user: 'Sue' }, ]; let x = endorsements.reduce((acc, { skill, user }) => { if (skill in acc) { acc[skill] = { user: [...acc[skill]['user'], user], count: acc[skill]['count'] + 1, skill: skill, }; } else { acc[skill] = { user: [user], count: 1, skill: skill, }; } return acc; }, {}); console.log(Object.values(x)); Meno
↳
I did in a different way let outPut = []; let skillMap = {}; for (let char of endorsements) { if (char['skill'] in skillMap) { skillMap[char['skill']] = [...skillMap[char['skill']], char['user']]; } else { skillMap[char['skill']] = [char['user']]; } } for (let key in skillMap) { let skillObj = {}; skillObj['skill'] = key; skillObj['user'] = skillMap[key]; skillObj['count'] = skillMap[key].length; outPut.push(skillObj); } return outPut.sort((a, b) => b.count - a.count); Meno
↳
getSkills = endorsements => { const skillMap = {}; // assumption - each object has all the properties, nothing is missing endorsements.forEach((item, index) => { const { skill, user } = item; if (!skillMap[skill]) { skillMap[skill] = {}; skillMap[skill]["user"] = []; // skillMap[skill]["user"].push(user); skillMap[skill]["count"] = 0; } skillMap[skill]["user"].push(user); skillMap[skill]["count"] += 1; // } }); return Object.keys(skillMap).map(key => [ { skill: key, ...skillMap[key] } ]); }; Meno
↳
var Emitter = function() { this.events = {}; }; var Subscription = function(event, callback, event_listeners, key) { this.event = event; this.callback = callback; this.event_listeners = event_listeners; this.key = key; }; Subscription.prototype.release = function () { var ret = false; if (this.event_listeners[this.key]) { delete this.event_listeners[this.key]; ret = true; } return ret; }; Emitter.prototype.subscribe = function(event_name, callback) { if (!this.events.hasOwnProperty(event_name)) { this.events[event_name]; this.events[event_name] = []; } var subscription = new Subscription(event_name, callback, this.events[event_name], this.events[event_name].length); this.events[event_name].push(subscription); return subscription; }; Emitter.prototype.emit = function(event_name, param1, param2) { var subs = this.events[event_name]; return subs.forEach(function(sub) { return sub.callback.call(sub, param1, param2); }); } Meno
↳
class Emitter { constructor() { this.events = {}; } on(name, handler) { (this.events[name] || (this.events[name] = [])).push(handler); return this.off.bind(this, name, handler); } off(name, handler) { this.events[name] && this.events[name].filter(handle => handle === handler); } emit(name, ...payload) { this.events[name].map(handler => handler(...payload)); } } Meno
↳
class Emitter { constructor() { this.cb = {}; } subscribe = (name, cb) => { this.cb[name] = cb; return {release: () => delete this.cb[name]}; } emit = (name, ...arges) => { this.cb[name](arges); } }; e = new Emitter(); rm1 = e.subscribe("f1", p => console.log("f1111 ", p)); rm2 = e.subscribe("f2", p => console.log("f222 ", p)); e.emit("f1", "GGG", "ssskoko") e.emit("f1", "GGG", "ssskoko", 1,5,7,2,3) Meno
↳
Reservations per day I guess
↳
It's always revenue my man/woman
↳
"It's always revenue my man/woman." I hope you understand how irrelevant you observation is in the context of this position. So no, it's not "always revenue." Meno