【问题标题】:Array pointers in javascriptjavascript中的数组指针
【发布时间】:2016-06-21 21:41:00
【问题描述】:

JavaScript 是否以某种方式支持指针运算?

例如,我有数组

var arr = [1,2,3,4];
console.log(arr);    /* this prints [1,2,3,4] */

是否可以这样做:

var arr2 = arr + 2;  /* obviously this is not the correct way */
console.log(arr2);   /* this should have printed [3,4] */

无需创建数组的副本(我只需要 C 中的指针)。

我需要这个的具体原因如下:我有一个大数组,其中每个元素都是一对字符串,布尔值,例如

var arr = [['name1',true],['name2',false]];

我想将数组输入到 ng-repeat(我正在使用 Angular JS)。该数组由数千个这样的元素组成,并且来自服务/工厂(即通过引用返回)。我想在 4 列中显示数组的内容,每个字符串后面都有一个复选框。为此,我通过以下方式进行了 4 次 ng 重复:

<div class="col-lg-3">
  <div class="checkbox" ng-repeat="x in arr" ng-if="$index % 4 == 0">
    <label><input type="checkbox" ng-model="x[1]">{{x[0]}}</label>
  </div>
</div>
<div class="col-lg-3">
  <div class="checkbox" ng-repeat="x in arr" ng-if="$index % 4 == 1">
    <label><input type="checkbox" ng-model="x[1]">{{x[0]}}</label>
  </div>
</div>
<div class="col-lg-3">
  <div class="checkbox" ng-repeat="x in arr" ng-if="$index % 4 == 2">
    <label><input type="checkbox" ng-model="x[1]">{{x[0]}}</label>
  </div>
</div>
<div class="col-lg-3">
  <div class="checkbox" ng-repeat="x in arr" ng-if="$index % 4 == 3">
    <label><input type="checkbox" ng-model="x[1]">{{x[0]}}</label>
  </div>
</div>

这个方法很慢,因为我需要遍历数组4次。 我无法对数组进行预处理(即,将其分成四个等大的部分,我将在没有 ng-if 的情况下将它们传递给每个 ng-repeat),因为我使用 ng-model 指令来允许用户更新数组,并且反过来服务(这是自动完成的,因为数组是通过服务引用返回的)。

因此,(理论上)理想的情况是有四个指针(每个指针指向数组的特定部分),并使用 limitTo 过滤器将每个指针传递给 ng-repeat。

【问题讨论】:

  • 不,因为它不使用这样的指针作为内存。 (它使用指针,但不支持 C 类型数学)
  • 那会很好,但是会发生什么它会被转换成一个字符串
  • 它确实支持索引。不知道你为什么不直接使用它?或拼接。
  • 感谢您的回答。我将解释我的设置以及为什么我需要这些指针。我有一个巨大的数组(数千个元素),我需要将它输入到一个 ng-repeat(我正在使用 Angular JS)。数组内容将打印成四列,因此我需要运行 ng-repeat 四次,一次使用 ng-if="$index % 4 == 0",一次使用 ng-if="$index % 4 == 1" 等等。这使得加载太慢。我的想法是有 4 个指向适当数组位置的指针,并使用 limitTo 过滤器将每个指针提供给 ng-repeat。这只会通过数组一次而不是四次。
  • @Tomas 是否有一个原因,您不能遍历列表一次并在遇到元素时将列数据插入正确的位置?

标签: javascript arrays angularjs


【解决方案1】:

不,JavaScript 不提供那种内存级别的访问权限。

如果您想从给定位置开始传递数组的某些部分,那么您可以做的最好的事情(确实会创建一个副本)是滥用slice。显然,这仅在您在数组中移动 向前 时才有效,而不是向后移动。

var arr = [1, 2, 3, 4, 5];

// Kinda, sorta but not really create a pointer at a given point in the array
// It doesn't actually refer to the original array. It creates a copy of a subsection of the array
var pretendPointerButNotAtAll = arr.slice(2);

// Almost like doing pointer arithmetic. You get the same value as doing arr[4]
// or arr + 4 in a language with pointers
var elementAtOffset = pretendPointerButNotAtAll[2];
console.log(elementAtOffset);

【讨论】:

    【解决方案2】:

    您是否要在控制台中从某个位置打印出数组到末尾?

    var arr = [1,2,3,4];
    console.log(arr);  
    console.log(arr.splice(2));
    

    【讨论】:

      【解决方案3】:

      你可以达到同样的效果

      yourArray.splice(2)
      

      【讨论】:

        猜你喜欢
        • 2014-02-22
        • 1970-01-01
        • 2020-03-01
        • 2020-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-30
        相关资源
        最近更新 更多