连接数组前缀和数组反向前缀的最佳方法

时间:2017-11-21 09:52:00

标签: javascript arrays

给定两个数组和两个索引,我需要连接第一个数组的前缀和第二个数组的反向前缀。

例如:

// Input
arr1 = [1,2,3,4,5,6,7,8,9];
arr2 = [10,11,12,13,14,15];
ind1 = 6;
ind2 = 3;

// Output
arr = [1,2,3,4,5,6,12,11,10];

这是我的代码:

function Concat(arr1,arr2,ind1,ind2) {
    let arr = [];
    for (let n = 0; n < ind1; n++)
        arr.push(arr1[n]);
    for (let n = ind2; n > 0; n--)
        arr.push(arr2[n-1]);
    return arr;
}

我正在寻找一种更好的(更干净/更快/更简单/更优雅)的方法来实现这一目标。

你有什么想法吗?

谢谢。

6 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

注意:这不会比目前的做法更快。这只是一点点清洁。

&#13;
&#13;
function Concat(arr1,arr2,ind1,ind2) {
  return [].concat(arr1.slice(0, ind1), arr2.slice(0, ind2).reverse());
}

arr1 = [1,2,3,4,5,6,7,8,9];
arr2 = [10,11,12,13,14,15];
ind1 = 6;
ind2 = 3;

console.log(Concat(arr1, arr2, ind1, ind2))
&#13;
&#13;
&#13;

正如所建议的那样,不会对性能产生巨大影响。您可以检查差异 js-perf sample

如果您有能力覆盖输入结构,则可采用其他方法。

由于我们期望自定义顺序的对象数组,因此很容易使它成为通用的。假设结构为:

请注意语法,因为我正在大量使用Typescript,我更容易用这种语法编写。

interface ConcatObject {
  value: Array<any>;
  endIndex: number;
  isReverse: boolean
}

当你阅读时,它使代码更容易阅读,更简单,使它更通用。

&#13;
&#13;
function Concat(arr) {
  return arr.reduce(function(acc, cur) {
    var temp = cur.value.slice(0, cur.endIndex);
    if (cur.isReverse) {
      temp = temp.reverse();
    }
    return acc.concat(temp);
  }, []);
}

var data = [{
    value: [1, 2, 3, 4, 5, 6, 7, 8, 9],
    endIndex: 6
  },
  {
    value: [10, 11, 12, 13, 14, 15],
    endIndex: 3,
    isReverse: true
  }
]

console.log(Concat(data))
&#13;
&#13;
&#13;

答案 1 :(得分:2)

如果ES6不是问题,可以通过以下代码执行:

&#13;
&#13;
var arr1 = [1,2,3,4,5,6,7,8,9];
var arr2 = [10,11,12,13,14,15];
var ind1 = 6;
var ind2 = 3;
var output = [...arr1.slice(0, ind1), ...arr2.slice(0, ind2).reverse()];
console.log(output);
&#13;
&#13;
&#13;

如果您不想使用ES6传播语法,可以使用 array.prototype.concat

&#13;
&#13;
var arr1 = [1,2,3,4,5,6,7,8,9];
var arr2 = [10,11,12,13,14,15];
var ind1 = 6;
var ind2 = 3;
var output = arr1.slice(0, ind1).concat(arr2.slice(0, ind2).reverse());
console.log(output);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

最简单的解决方案

<强>代码:

def _create_user(self, username, email, password, **extra_fields):
    ....

def create_user(self, username, email=None, password=None, **extra_fields):
    ....

清洁,快速,高效。

答案 3 :(得分:0)

如果要连接多个阵列,可以查看此解决方案。这样,您就可以使用concat function cascading所需的数组数量以及使用的顺序。您可以继续此级联,并使用optional parameter reverse订单。

const arr1 = [1,2,3,4,5,6,7,8,9];
const arr2 = [10,11,12,13,14,15];

const obj = {
  items: [],
  concat(arr, index, isReverse = false) {
     let temp = arr.slice(0, index);
     this.items = this.items.concat(isReverse ? temp.reverse() : temp);
     return this;
  }
};

obj.concat(arr1, 6).concat(arr2, 3, true);
console.log(obj.items);

答案 4 :(得分:0)

使用es6

&#13;
&#13;
let arr1 = [1,2,3,4,5,6,7,8,9],
    arr2 = [10,11,12,13,14,15];
let ind1 = 6,
    ind2 = 3;

let newArr = [...arr1.slice(0, ind1), ...arr2.slice(0, ind2).reverse()];

console.log(newArr)
&#13;
&#13;
&#13;

答案 5 :(得分:0)

使用数组的reverse()concat()实现此目的的最简单方法是:

var arr1 = [1,2,3,4,5,6,7,8,9];
var arr2 = [10,11,12,13,14,15];
var ind1 = 6;
var ind2 = 3;


var arrTemp1 = arr1.slice(0,ind1);
var arrTemp2 = arr2.slice(0,ind2).reverse();
var res = arrTemp1.concat(arrTemp2);
console.log(res);