代码之家  ›  专栏  ›  技术社区  ›  BKS

在Java脚本中更改变量

  •  0
  • BKS  · 技术社区  · 8 年前

    在JS中,我有一个变量列表,我将其洗牌。我想保持无序排列的顺序,但要更改列表中变量的值。有办法吗?下面是我的代码示例。我在评论中解释我想要什么。

    <p id="demo"></p>
    
    <script>
    var gen = "male "
    var race = "white "
    var rel = "christian "
    
    var chars =[gen,race,rel]
    chars = shuffle(chars); 
    
    document.getElementById("demo").innerHTML = chars+"";
    
    /*prints for example "white christian male " which is what I want
    
    /*lets say I want to change the gender, and maintain the newly shuffled order (race-rel-gen in this case)*/ 
    
    /* The below doesn't work. I want it to print "white christian female ", but it just reprints the original string*/
    
    gen = "female "
    
    document.getElementById("demo").innerHTML = chars+"";
    </script>
    
    6 回复  |  直到 8 年前
        1
  •  2
  •   luiscrjr    8 年前

    考虑到您想要保持预洗牌顺序,您可以尝试使用对象,而不是字符串,然后它将保留引用。比如:

    /* function to convert your array of objects into a pretty string */
    const arrtoStr = (arr) => arr.map((obj) => obj.value).join(' ')
    
    var gen = { value: "male" }
    var race = { value: "white" }
    var rel = { value: "christian" }
    
    var chars =[gen,race,rel]
    chars = shuffle(chars); 
    
    //will output, for instance: "white christian male"
    document.getElementById("demo").innerHTML = arrtoStr(chars);
    
    // change object's key named 'value'
    gen.value = "female"
    
    //will output: "white christian female"    
    document.getElementById("demo").innerHTML = arrtoStr(chars);
    
        2
  •  2
  •   zfrisch    8 年前

    你可以用 map 对象和一些用于处理此问题的补充函数。

    let char = new Map([
      ['gen', 'male'],
      ['race', 'white'],
      ['rel', 'christian'],
      ["order", shuffle([0,1,2])],
      ["display", ['gen', 'race', 'rel']]
    ]);
    
    function shuffle(arr) {
      return arr.sort(_ => Math.random() > .5);
    }
    
    function display(mItm) {
    return mItm.get("order").map(itm => mItm.get(mItm.get("display")[itm])); 
    }
    
    //display char
    document.querySelector("#demo").innerHTML += "</br>" + display(char);
    
    //display new race
    char.set("race", "blue");
    document.querySelector("#demo").innerHTML += "</br>" + display(char);
    
    // reshuffle
    char.set("order", shuffle(char.get("order")));
    document.querySelector("#demo").innerHTML += "</br>" + display(char);
    <p id="demo"></p>
        3
  •  1
  •   jackrugile    8 年前

    如果我理解正确,下面的解决方案应该有效。保持沉默 person 对象和an order 数组分离应该给您更多的灵活性。我在用 Lodash 对于 shuffle 为方便起见。

    CodePen Demo

    this.person = {
     gen: "male",
     race: "white",
     rel: "christian"
    };
    
    this.order = ["gen", "race", "rel"];
    
    function output() {
      let temp = [];
      this.order.forEach((key) => {
        temp.push(this.person[key]);
      });
      document.getElementById("demo").innerHTML += temp.join(", ") + "<br>";
    }
    
    // shuffle the order of properties
    _.shuffle(this.order);
    
    // output original data
    output();
    
    // change specifics, but keep the order of properties
    this.person["gen"] = "female";
    output();
    
    this.person["race"] = "black";
    output();
    
    this.person["rel"] = "jewish";
    output();
    
        4
  •  0
  •   AndrewL64    8 年前

    可以在分配新变量值后再次分配数组,如下所示:

    var gen = "male "
    var race = "white "
    var rel = "christian "
    
    var chars =[gen,race,rel]
    chars = shuffle(chars); 
    
    document.getElementById("demo").innerHTML = chars+"";
    
    
    gen = "female "
    var chars =[gen,race,rel]
    chars = shuffle(chars); 
    document.getElementById("demo").innerHTML = chars+"";
    

    jsFiddle: https://jsfiddle.net/AndrewL64/p6rgo01a/


    或者创建一个可重用的函数,如下所示:

    function newVal(gen, race, rel) {
        var chars =[gen,race,rel]
        chars = shuffle(chars);
        document.getElementById("demo").innerHTML = chars+"";
    }
    
    newVal('male ','white ', 'christian ');
    
    newVal('female','white ', 'christian ');
    

    jsFiddle: https://jsfiddle.net/AndrewL64/p6rgo01a/1/

        5
  •  0
  •   marmeladze    8 年前

    你,可能问错了问题,或者,你最初的意图没有反映在问题中,但据我所知,你在寻找这样的东西。

    var races = ["caucasian", "ethiopian", "malayan", "american", "mongolian"];
    var beliefs = ["jewish", "buddhist", "muslim", "christian", "shintoist"];
    var genders = ["male", "female"];
    
    var randomArrayElement = function(arr) {
      return arr[Math.floor(Math.random() * arr.length)];
    }
    
    function makeCombo(r, b, g) {
      var race = randomArrayElement(r);
      var belief = randomArrayElement(b);
      var gender = randomArrayElement(g);
      return [race, belief, gender].join(" ");
    }
    
    document.querySelector("button").addEventListener("click", function(e){
      document.getElementById("profile-area").innerText = makeCombo(races, beliefs, genders);
    })
    <p id='profile-area'></p>
    <button>Generate a profile</button>
        6
  •  0
  •   Daanist    8 年前

    你应该定义一个洗牌函数。比如:

    // define shuffle function
    function shuffle(arr) {
      for (let i = arr.length - 1; i > 0; i--) {
          const j = Math.floor(Math.random() * (i + 1));
          [arr[i], arr[j]] = [arr[j], arr[i]];
      }
      return arr;
    }
    

    然后可以使用调用此函数 chars 作为一个参数来创建一个如下的无序数组:

    var chars = [gen, race, rel];
    

    然后可以将结果输出为如下字符串:

    document.getElementById("demo").innerHTML = shuffle(chars).join(" ");
    

    这个 join(" ") 将逗号替换为空格。

    选项1)使用新值重新洗牌

    作为你的原创 查斯 数组的顺序不会乱序,您可以通过以下操作更改值:

    chars[0] = "female";

    您可以通过再次调用shuffle函数来更新DOM,如上所示。

    选项2)保持洗牌顺序,并用更新的值输出

    要保持无序排列的顺序,但使用更新的值再次输出数组,需要将无序排列的输出存储在新变量中。你会得到这样的结果:

    var chars = [gen, race, rel];
    var shuffled = shuffle(chars);
    
    document.getElementById("demo").innerHTML = shuffled;
    
    // change value of gen
    shuffled[shuffled.indexOf("male")] = "female";
    
    // output again
    document.getElementById("demo").innerHTML = shuffled;
    
    推荐文章