V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
6god
V2EX  ›  JavaScript

求助 请帮忙解释 2 行 javascript 代码

  •  1
     
  •   6god · 2015-09-22 11:44:20 +08:00 · 1911 次点击
    这是一个创建于 3145 天前的主题,其中的信息可能已经有所发展或是发生改变。

    var array1 = ['A', 'B', 'C'],
    array2 = [],
    done = {}, random; // {} 在这里是什么东西呢?

    while (array1.length * 2 != array2.length) {
    random = Math.floor(Math.random() * array1.length);
    if (done[random] != 2) { //这一步完全不理解
    array2.push(array1[random]);
    done[random] = (done[random] || 0) + 1; //还有这个
    }
    }

    :)

    SilentDepth
        1
    SilentDepth  
       2015-09-22 13:05:50 +08:00
    {}就是一个空对象,和第 2 行一个路数(快速创建新数组 /对象)
    random 被赋值为 0 到 array1 长度之间的一个随机值,所以 done[random]就是取 done 这个对象的某个随机的属性(把 done 看成一个数组也没啥问题),又所以 done[random] != 2 保证 done 的成员最终都会变成 2 。
    done[random] || 0 (应该是看不懂这个吧)的意思是「取 done[random],如果取到的是 undefined 、 null 之类的逻辑否值,则返回 0 ,相当于给个替换空值的默认值)。

    这是个啥程序?掏兜摸小球、每个摸两次?
    6god
        2
    6god  
    OP
       2015-09-22 13:24:58 +08:00
    @SilentDepth 谢谢你啦 :) 这个程序的作用是把 a b c 分别两次写道新的数组里, 并且是无序排列
    xuyinan503
        3
    xuyinan503  
       2015-09-22 16:30:11 +08:00
    done 是一个计数器
    array2.push(array1[random]);//array1 的数据插入之后
    done[random] = (done[random] || 0) + 1; //done 加 1

    if (done[random] != 2) { //当 done 计数为 2 的时候,不做 push ,继续随机
    joyee
        4
    joyee  
       2015-09-22 17:57:53 +08:00
    1. 你把 done 看成一个 hash , key 是生成的随机数, value 是自己维护的计数
    2. done[random] = (done[random] || 0) + 1; 看成这样就行了

    var tmp;
    if (done[random])
    tmp = done[random];
    else
    tmp = 0;

    done[random] = tmp + 1;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2251 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:34 · PVG 15:34 · LAX 00:34 · JFK 03:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.