【问题标题】:Javascript use original array when creating subarrayJavascript在创建子数组时使用原始数组
【发布时间】:2014-10-02 11:55:53
【问题描述】:

我是 Javascript 新手,遇到以下问题:

我有一个保持不变的对象数组。从这个数组中,我想创建具有不同开始和结束索引的子数组。

var origArr = [o1, o2, o3, o4, o5];
// origArr .length = 5
var subArr = origArr.slice(1, 4);
// subArr  = [o2, o3, o4];

通常我可以使用切片方法。但这意味着元素被复制到新数组中。由于我想要做的就是改变开始和结束索引,有没有什么简单的方法可以做到这一点,而无需每次都创建一个新副本?我只会使用对原始数组的引用。

感谢您的帮助。

克里斯

【问题讨论】:

  • 如果要修改原始数组,则必须使用.pop().shift()
  • 你的意思是修改原来的数组吗?
  • 您是否正在寻找一个可以作为原始数组视图的对象,所以origArr[2] = 0 会导致subArr[1] 也为0?没有内置的东西。您可以为它编写自己的包装器对象,尽管它可能比仅使用切片要慢。
  • 你到底想做什么?你能给我们一个更大的图景吗?我们可能会建议一种算法。
  • 子数组用作另一个库中函数的参数。随着用户更改滑块的值,正在传递的子数组(时间段)的长度会发生变化。所以传递给函数的数据范围确实发生了变化,但元素保持不变。

标签: javascript arrays clone


【解决方案1】:

您无法使用标准 JavaScript 数组创建数组子集的“视图”。您可以使用新的typed arrays 来做到这一点,但新的类型化数组仅提供各种数字格式的存储。您的变量名称(o1 等)建议使用对象引用。

对于标准数组,您可以使用函数:

function subMapper(array, index, length) {
    return function(i, value) {
        if (index + i >= length) {
            // Beyond the end of the array, do what you think is appropriate
        }
        if (arguments.length === 1) {
            // Getting a value
            return array[index + i];
        }
        // Setting a value
        array[index + i] = value;
    };
}

var origArr = [o1, o2, o3, o4, o5];
var subArrMapper = subMapper(origArr, 1, 4);
var x = subMapper(0);
console.log(x === o2); // true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2015-06-30
    相关资源
    最近更新 更多