是否有功能将数组范围内的一组元素复制到另一个数组范围内?

时间:2018-08-28 23:31:11

标签: javascript arrays

我的javascript代码中有一个地方需要执行

之类的操作

将一个数组中的指定范围复制到另一个数组中的指定范围。

操作类似于

1)Java中的System.arraycopy->

System.arraycopy(array1, index1, array2, index3, index4 - index4 + 1);

2)copy进入->

copy(array2[index3:index4 + 1], array1[index1:index2+1])

3)python中的切片->

array2[index3: index4 + 1] = arr[index1: index2+1]

现在,我要手动进行迭代。 但是我没有在js中使用任何util函数来做到这一点。真的有一个吗?

更新1 :它应该只复制而不应该从两个给定数组中的任何一个中添加或删除元素。

它的行为应类似于以下实现:

function arraycopy(src, srcPos, dst, dstPos, length) {
    let j = dstPos;
    let tempArr = src.slice(srcPos, srcPos + length);
    for (let e in tempArr) {
        dst[j] =  tempArr[e];
        j++;
    }
};

更新2 :(请仔细阅读下面的一些答案,看看它是否适合您的用例(例如在大型数据集的情况下))下面的许多答案都以这样的方式使用了拼接头,如果源数组中开始到结束的范围很大。它将抛出“ RangeError:超出最大调用堆栈大小” ...,因为它将超出函数中允许的最大参数数量。 (尝试演示脚本here)“

7 个答案:

答案 0 :(得分:2)

结合使用slicesplice可能是这里的方法。您可以编写一个辅助函数来模仿其他语言中的相同行为。这是一个反映Java arraycopy方法的方法:

const arr1 = [1, 2, 3, 4, 5, 6];
const arr2 = ["a", "b", "c", "d", "e", "f"];

function arrayCopy(src, srcIndex, dest, destIndex, length) {
  dest.splice(destIndex, length, ...src.slice(srcIndex, srcIndex + length));
}

// copy from arr1, at position 0, into arr2, at position 2, 3 elements.
arrayCopy(arr1, 0, arr2, 2, 3);
console.log(arr2)

答案 1 :(得分:1)

我不知道有一个功能,但是我认为可以使用slice()splice()来实现此功能。

  

slice()方法将一个数组切成一个新数组。

     

splice()方法可用于向数组添加新项。

答案 2 :(得分:1)

您可以使用Array.prototype.splice()(以及方法Array.prototype.slice())来完成您要描述的内容。

假设您要从数组A中将索引3到5(含)复制到数组B的索引3中(将B中的所有内容从索引3替换为5):

const A = [0, 1, 2, 3, 4, 5, 6];
const B = ['a', 'b', 'c', 'd'];

const start = 3;
const end = 6;

// Splice (end - start) elements starting at 3
// with elements from start to end in A
B.splice(3, end - start, ...A.slice(start, end));

console.log(B);

注意:这还利用了JavaScript的spread operator,它从A.slice()返回的数组中发出所有单独的值。

编辑

请考虑以下因素:

  

更新1 :它应该只复制而不应该从两个给定数组中的任何一个中添加或删除元素。

  

...如果源数组中的起始范围很大,则会中断。

考虑以下功能:

function arrayCopy(arr1, index1, arr2, index2, length) {
    return []
        .concat(arr2.slice(0, index2))                  // Array 2 from beginning until the index to replace
        .concat(arr1.slice(index1, index1 + length))    // Array 1 from the index to copy for 'length' elements
        .concat(arr2.slice(index2 + length));           // Rest of Array 2, 'length' elements past the index to replace
}

const A = [0, 1, 2, 3, 4, 5, 6];
const B = ['a', 'b', 'c', 'd'];

// Copy B into Z and replace Z[3] to Z[5] with A[3] to A[5]
const Z = arrayCopy(A, 3, B, 3, 3);

console.log('\'A\' after copy:');
console.log(A);
console.log('\'B\' after copy:');
console.log(B);
console.log('\'Z\' after copy:');
console.log(Z);

// Testing the method with arrays of length 2,000,000

const longArray = [];
const otherLongArray = [];

for (let i = 0; i < 2000000; i++) {
    longArray.push(i);
    otherLongArray.push(-i);
}

const newLongArray = arrayCopy(longArray, 0, otherLongArray, 1500000, 1000000);

console.log(newLongArray.length);

这将创建一个 new数组,它是第二个输入数组的副本,但是用{替换了该数组中length个元素(从index2开始)第一个输入数组中{1}}个元素的数量(从length开始)。该函数利用Array.prototype.concat()来接受完整数组作为参数。当数组很大时,这应该可以缓解“ callstack”错误问题。

答案 3 :(得分:1)

另一种方法是使用slice从源数组中切出所需的元素(不对其进行更改),然后使用forEach用切出的元素替换distination数组中的元素:

function arraycopy(src, srcPos, dst, dstPos, length) {
    src.slice(srcPos, srPos + length)
       .forEach((e, i) => dst[dstPos + i] = e);
}

示例:

function arraycopy(src, srcPos, dst, dstPos, length) {
    src.slice(srcPos, srcPos + length)
       .forEach((e, i) => dst[dstPos + i] = e);
}

let arr1 = [0, 1, 2, 3, 4, 5, 6];
let arr2 = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];

arraycopy(arr1, 2, arr2, 3, 3);

console.log("arr1: " + arr1);
console.log("arr2: " + arr2);

答案 4 :(得分:1)

JavaScript中没有类似的东西。可能有具有类似功能的JavaScript库,但我不知道。简单的循环和赋值将更加有效,因为它避免了函数调用和创建新数组的开销:

MATCH (c)
WHERE id(c) = 123 // standin for however you match to your starting node
MATCH (a:TABLE)
WHERE a.name in c.filter
WITH c, collect(a) as allowed
MATCH (a:TABLE)-[:SOURCES*]->(c)
WHERE a in allowed
RETURN a


完整性的另一种低效替代方法是使用function arraycopy(src, srcPos, dst, dstPos, length) { while (length--) dst[dstPos++] = src[srcPos++]; return dst; } console.log( arraycopy([2,3,4,5,6], 1, [1,1,1,1,1,1], 2, 3) )复制值:

Object.assign

答案 5 :(得分:0)

JavaScript Array slice()和concat()方法符合您的要求。

var arr= ["a", "b", "c", "d", "e"];
var arr2 = ["x","y","z"];
arr= arr.slice(0, index3).concat(arr2.slice(index1: index2+1)).concat(arr.slice(index4+1, arr.length));

HTML file for trial

答案 6 :(得分:0)

您可以使用slice方法将一系列元素从一个数组复制到另一个数组,并保持原始数组不变。

slice方法接受两个参数,第一个参数是复制操作的start index,第二个参数是复制操作的end indexend index 未包含在结果数组中。

以下是所讲内容的说明:

var arr1 = ['Hi ', 'there! ', 'How ', 'are ', 'you ?'];
var arr2 = arr1.slice(2, arr1.length);
console.log(arr2.toString());
// output: How ,are ,you ?

详细了解slice方法。