【问题标题】:JavaScript equivalent of PHP $array[$i][]JavaScript 等价于 PHP $array[$i][]
【发布时间】:2015-02-10 23:27:10
【问题描述】:

我在 JavaScript 中创建多维数组时遇到问题。

PHP 代码如下所示:

<?php
$matches = array(1, 2, 3, 4, 4, 4, 6, 6, 2, 3);

foreach($matches as $match) {

     $levels[$match][] = $match;
}

print_r($levels);
?>

print_r of $levels:

levels[1][0] = 1
levels[2][0] = 2
levels[3][0] = 3
levels[4][0] = 4
levels[4][1] = 4
levels[4][2] = 4
levels[6][0] = 6
levels[6][1] = 6
levels[2][1] = 2
levels[3][1] = 3

我在 JavaScript 中创建相同的数组时遇到问题。

<script>
var levels = [];

$([1, 2, 3, 4, 4, 4, 6, 6, 2, 3]).each(function(key, value) {

     levels[value][] = value;
});
</script>

谁能帮我在 JavaScript 中创建相同的数组?

【问题讨论】:

    标签: javascript php arrays multidimensional-array equivalent


    【解决方案1】:

    Felix 的回答很好,可读性强,我只是想向您介绍几个有用的成语。

    与 php 不同,javascript || (boolean OR) 运算符,尽管它的名字,不返回布尔值,而是第一个非假操作数。所以当你写

    a = thing || otherThing
    

    如果thing 是假的(= null, undefined, 0, empty string),则结果将为otherThing。因此像这样检查

    if(!foo)
       foo = bar
    

    可以更简洁地写成

    foo = foo || bar
    

    如果foo 为真,它只是将foo 分配给foo(无操作),否则,foo 变为bar

    应用于您的问题,如下所示:

    levels[value] = levels[value] || [];
    levels[value].push(value);
    

    如果您想进一步缩短,请将push 替换为concat

    levels[value] = (levels[value] || []).concat(value);
    

    这不一定更具可读性或效率,只是一些值得了解的东西。

    【讨论】:

    • 纪念您的回答的解决方案:[1, 2, 3, 4, 4, 4, 6, 6, 2, 3].reduce(function (p, c) { (p[c] || (p[c] = [])).push(c); return p; }, []);
    【解决方案2】:
    var levels = [];
    var orgArray = [1, 2, 3, 4, 4, 5, 6, 2];
    for (var i = 0; i < orgArray.length; i++) {
        var value = orgArray[i];
        if (levels[value] === undefined)
            levels[value] = []
        levels[value].push(value);
    }
    //Print
    for (var j = 0; j < levels.length; j++)
        if (levels[j])
            for (var k = 0; k < levels[j].length; k++)
                console.log("levels[" + j + "][" + k + "] = " + levels[j][k]);
    

    这有点矫枉过正,但我​​想你会明白的。 不要忘记检查您的元素是否存在

    【讨论】:

      【解决方案3】:

      如果没有数组,JavaScript 不会神奇地创建数组。您必须自己创建它。所以会是这样的

      $([1, 2, 3, 4, 4, 4, 6, 6, 2, 3]).each(function(key, value) {
          if (levels[value] == null) {
              levels[value] = [];
          }
          levels[value].push(value);
      });
      

      Learn more about arrays.

      【讨论】:

      • 请使用=== 而不是==。更好的是,if(!levels[value])
      • @JanDvorak:如果我使用===,它将无法工作,因为条件永远不会满足。 x == null 只是 x === null || x === undefined 的简写形式。但是,是的,在这里简单地转换为布尔值也可以。
      • 抱歉...从未见过有人实际使用== null 代替x === null || x === undefined。我想这也是我不应该这样做的原因。
      猜你喜欢
      • 1970-01-01
      • 2011-05-29
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2020-07-27
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多