给定两个数组和两个索引,我需要连接第一个数组的前缀和第二个数组的反向前缀。
例如:
// 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;
}
我正在寻找一种更好的(更干净/更快/更简单/更优雅)的方法来实现这一目标。
你有什么想法吗?
谢谢。
答案 0 :(得分:2)
您可以尝试这样的事情:
注意:这不会比目前的做法更快。这只是一点点清洁。
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;
正如所建议的那样,不会对性能产生巨大影响。您可以检查差异 js-perf sample 。
如果您有能力覆盖输入结构,则可采用其他方法。
由于我们期望自定义顺序的对象数组,因此很容易使它成为通用的。假设结构为:
请注意语法,因为我正在大量使用Typescript,我更容易用这种语法编写。
interface ConcatObject {
value: Array<any>;
endIndex: number;
isReverse: boolean
}
当你阅读时,它使代码更容易阅读,更简单,使它更通用。
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;
答案 1 :(得分:2)
如果ES6不是问题,可以通过以下代码执行:
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;
如果您不想使用ES6传播语法,可以使用 array.prototype.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 output = arr1.slice(0, ind1).concat(arr2.slice(0, ind2).reverse());
console.log(output);
&#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
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;
答案 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);