suchen

Heim  >  Fragen und Antworten  >  Hauptteil

javascript – So implementieren Sie verschachtelte Methoden mit angegebener Tiefe in js

Ich habe heute ein Problem bei der Implementierung eines Algorithmus mit js festgestellt. Wie kann ich bei gegebener Funktion und Verschachtelungstiefe (int-Typ) eine verschachtelte Struktur zurückgeben?

Gegebene Parameter: fn, deepLength

Rückgabestruktur (nehmen Sie als Beispiel deepLength=3):

  for (var x = 0; x <= 9; x++) {
    for (var y = 0; y <= 9; y++) {
      for (var z = 0; z <= 9; z++) {
        rs = fn([x,y,z])
      }
    }
  }

Nachdem ich eine Weile darüber nachgedacht habe, scheint es, dass dies nur durch verschachtelte Funktionen erreicht werden kann. Gibt es eine elegantere Implementierungsmethode?


Ich habe alle Methoden zusammengefasst und sie als Referenz auf eine Demoseite gestellt

Angehängter Link zur Interviewfrage: Kekse teilen

PHP中文网PHP中文网2775 Tage vor481

Antworte allen(3)Ich werde antworten

  • 大家讲道理

    大家讲道理2017-05-19 10:45:39

    function loop(fn, n, args = []) {
      if (n === 0) {
        fn.apply(null, args);
        return;
      }
    
      for (let i = 0; i <= 9; i++) {
        loop(fn, n - 1, args.concat(i));
      }
    }
    
    
    loop((...args) => {
      console.log(args);
    }, 3);

    Antwort
    0
  • 仅有的幸福

    仅有的幸福2017-05-19 10:45:39

    使用构建字符串的方式实现了,但感觉太不优雅了。。

    var deep = (fn, deeplen) =>{
      var rs = null;
      var args = [];
      var content = 'var trueArgs = [];for(var i =0;i<args.length;i++){trueArgs[i]=eval(args[i])}rs = fn(trueArgs);';
      for (var i = 0; i < deeplen; i++) {
        args.push(`iter${i}`);
        content = `for ( var iter${i} = 0; iter${i}<=9; iter${i}++){ ${content} }`;
      }
      new Function('fn', 'args', content)(fn, args);
      return rs;
    }

    面试题参考代码

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-05-19 10:45:39

    let loop = (fn, layer) => {
        return (arr) => {
            for (let i = 0; i <= 9; i++) {
                arr[layer] = i
                fn(arr)
            }
        }
    }
    let nestedLoop = (fn, deepLength) => {
        for (let i = deepLength; i > 0; i--) {
            fn = loop(fn, i - 1)
        }
        fn ([])
    }
    
    nestedLoop((arr) => console.log(arr.join('')), 3)

    Antwort
    0
  • StornierenAntwort