minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Este artigo resume as questões de codificação encontradas durante o processo de entrevista.
Observe que o verdadeiro valor retornado é para retenção, não para filtragem, então não se esqueça disso. Não é nada, só que vou esquecer se não escrever pessoalmente por meio ano. . .
arr.filter((item, índice, atual) => {return arr.indexOf(item) == índice});.Pode remover peso
A essência do filtro é criar um novo array e, se a função de retorno de chamada retornar verdadeiro, ele será retido. A linha de código acima significa que apenas a primeira vez é colocada dentro.
Desduplicação de ponteiro duplo:
Use ponteiros duplos para reordenar o array. Se forem iguais, o ponteiro rápido se moverá uma posição para a direita. Se não forem iguais, o ponteiro lento se moverá uma posição para a direita. o ponteiro rápido à direita para comparação com a próxima vez:
- function doublePointer(nums) {
- if(nums.length < 2) {
- return nums;
- }
- let slow = 0;
- let fast = 1;
- let result = [nums[0]];
- while(fast < nums.length) {
- if (result[slow] == nums[fast]) {
- fast++;
- } else {
- slow++;
- result[slow] = nums[fast];
- fast++;
- }
- }
- return result;
- }
- const arr = [1,1,2,2,4,4];
- console.log(doublePointer(arr));
Entrada [1,1,2,2,4,4] e saída [1,2,4].
Se a matriz for um objeto:
const arr2 = [{id:1,tempo: 2},{id:1,tempo: 4},{id:2,tempo: 2},{id:2,tempo: 4},{id:3,tempo: 5},
{id:3,tempo: 2}];
Agora precisamos remover duplicatas com base no ID. Se os IDs forem iguais, apenas o objeto com maior tempo será retido.
[{"id":1,"hora":4},{"id":2,"hora":4},{"id":3,"hora":5}]
- function doublePointerByorder(nums) {
- if(nums.length < 2) {
- return nums;
- }
- let slow = 0;
- let fast = 1;
- let result = [nums[0]];
- while(fast < nums.length) {
- if (result[slow].id == nums[fast].id) {
- if(result[slow].time < nums[fast].time) {
- result[slow] = nums[fast];
- }
- fast++;
- } else {
- slow++;
- result[slow] = nums[fast];
- fast++;
- }
- }
- return result;
- }
console.log(doublePointerByorder(arr2));
Claro, você pode usar um objeto vazio para lembrá-lo. A cada vez, compare o tempo correspondente ao ID no objeto e escolha se deseja substituí-lo. Após percorrer, use um loop for in para converter o objeto em um array. Porém, ponteiros duplos são muito eficientes. Se a quantidade de dados for grande, seria mais apropriado usar ponteiros duplos.
A atribuição de sinal de igual de variáveis de tipo de referência não afetará uma à outra.
No entanto, será afetado pelo uso de ab, que é considerado uma cópia superficial, conforme mostrado abaixo.
- person1 = {name: 3};
- members = person1;
- members.name = 4; // person1.name=4
Vamos dar uma olhada em um caso clássico relacionado a citações. Também foi uma pergunta que não anotei quando a encontrei pela primeira vez durante a entrevista. Converta o array em uma estrutura de árvore:
- function arrayToTree(items) {
- const tree = {};
- const map = {};
- items.forEach((item, index) => {
- const { id, parentId } = item;
- if (!map[id]) map[id] = { children: [] };
- const node = { ...item, children: map[id].children};
- map[id] = node;
- if (parentId) {
- if (!map[parentId]) {
- map[parentId] = { children: [] };
- } map[parentId].children.push(node);
- } else {
- tree[id] = node;
- }
- });
- console.log(map);
- }
-
- // 示例数组
- const items = [
- { id: 1, parentId: null, value: "A" },
- { id: 2, parentId: 1, value: "B" },
- { id: 3, parentId: 1, value: "C" },
- { id: 4, parentId: 2, value: "D" },
- { id: 5, parentId: 3, value: "E" }
- ];
-
- // 转换为树
- const tree = arrayToTree(items);
Você pode copiá-lo diretamente para ver o efeito, assim como uma boneca matryoshka russa. É fácil entender quando a segunda camada é adicionada à primeira camada. A dificuldade é que quando a terceira camada é adicionada à segunda camada, há. também uma terceira camada abaixo da segunda camada da primeira camada. Na verdade, se você pensar bem, poderá entender que há a["1"].children["2"] abaixo de a["1"], e seu valor não é apenas igual a a["2"], mas também uma referência são todos iguais, e execute a["1"].children.push(a["2"]);. Este benefício surge quando a["3"]={...item, children:[]} é executado, a["2"].children.push(a["3"]) é executado, porque está dentro os dados da operação, portanto, locais com a mesma referência (por exemplo, a=b, b.push também afetará a.push) também serão enviados, então você verá a["1"].children["2"] .crianças a["3"]. Esta é a estrutura de árvore correta.
Se você ainda não entendeu, você pode tentar o seguinte:
Conforme mostrado acima: b1 é considerado o nó de primeiro nível de a1, e a modificação de b1 afetará a1. Embora o texto acima seja um loop, as referências em cada escopo são as mesmas.
2 4 5 código síncrono, 3 micro tarefas, 1 macro tarefa.A única armadilha é que 4 será impresso, mas o retorno 3 não será executado.
Durante a comparação de conversão implícita, a matriz chama o método toString.
Você mesmo terá que escrevê-lo. Se nunca o escreveu antes, terá que rasgá-lo durante a entrevista e provavelmente não conseguirá arrancá-lo.Os seguintes são: execução imediata anti-vibração e execução atrasada, estrangulamento da execução imediata e execução atrasada
- function debounce(fn, delay) {
- let timer = null;
- return function (...args) {
- timer && clearTimeout(timer);
- timer = setTimeout(() => {
- fn.apply(this, args);
- }, delay);
- }
- }
-
- function debounce_immediate(fn, delay, immediate = false) {
- let timer = null;
- let flag = true;
- return function (...args) {
- timer && clearTimeout(timer);
- if (immediate) {
- if (flag) {
- fn.apply(this, args);
- flag = false;
- }
- timer = setTimeout(() => {
- flag = true;
- }, delay);
-
- } else {
- timer = setTimeout(() => {
- fn.apply(this, args);
- }, delay);
- }
- }
- }
-
- function throttle(fn, delay) {
- let lastTime = 0;
- let timer = null;
- return function (...args) {
- const nowTime = Date.now();
- if (nowTime - lastTime > delay) {
- fn.apply(this, args);
- lastTime = nowTime;
- }
- }
- }
-
- function throttle_D(func, delayTime) {
- let delay = delayTime || 1000;
- let timer = null;
- return function (...args) {
- if (!timer) {
- timer = setTimeout(function () {
- func.apply(this, args);
- timer = null;
- }, delay);
- }
- }
- }
Lembre-se de trazer argumentos. A diferença essencial entre anti-shake e throttling é que o anti-shake sempre zera o temporizador, enquanto o throttling não o faz. Se o throttling for sempre acionado, ele será executado dentro de um determinado intervalo de tempo e executado apenas uma vez. Se o anti-shake for acionado por um minuto, ele será executado apenas uma vez (execução imediata ou execução retardada acionada pelo último clique).