我有一组数组,每个数组都有相同的长度,其中2个是排序的
我从这个变量开始: var sky = 0,3,4,5,6,7,8,9,10,11,12,14,16,17;var ter = [];
我必须以这种方式分析每个天空项目:对于每个天空项目,我必须找到天空项目和sky+1之间的“距离”,然后从天空项目和sky+1+1等。所以
var ter = 3-0
var ter = 4-0
var ter = 5-0
var ter = 6-0
var ter = 7-0
var ter = 8-0
var ter = 9-0
var ter = 10-0
var ter = 11-0
var ter = 12-0
var ter = 14-0
var ter = 16-0
var ter = 17-0因此,天空阵列的第二个循环必须做同样的事情,但从天空阵列上的第二个项目开始,因此将是
var ter = 4-3
var ter = 5-3
var ter = 6-3
var ter = 7-3
var ter = 8-3
var ter = 9-3
var ter = 10-3
var ter = 11-3
var ter = 12-3
var ter = 14-3
var ter = 16-3
var ter = 17-3我不知道如何计算ter变量,在这一点上,也许最好的方法是将它放在数组中,就像这样
ter = [[3,4,5,6,7,8,9,10,11,12,14,16,17],[1,2,3,4,5,6,7,8,9,11,13,14], and so on];因此,在下一阶段,我可以引用ter数组
现在我只有开始,并没有完成,因为这只是一个开始,试图找到一个好的点,但我不知道为什么事件开始不工作,哈哈。在这个例子中我不需要最后一个17,因为我没有任何关于天空数组最后一项的东西
for (j = 0; j < sky.length; j++) {
if (j !== 0 || j !== sky.length){
ter.push(sky[j]-sky[0]);
}
}
console.log(ter);有什么快速的想法吗?
发布于 2017-01-07 02:37:08
我认为在这种情况下,递归比迭代更有效。
JavaScript (ES2015)
let dist = (a,r = []) => {
if(r.length <= a.length-2) {
let t = [];
let b = a[r.length];
a.forEach(e => t.push(e - b));
r.push(t.filter(e => e > 0));
return dist(a,r);
} else return r;
}
let sky = [0,3,4,5,6,7,8,9,10,11,12,14,16,17];
let ter = [];
console.log(dist(sky,ter));输出
[3,4,5,6,7,8,9,10,11,12,14,16,17,1,2,3,4,5,6,7,8,9,11,13,14,1,2,3,8,10,12,13,1,2,3,4,5,7,9,11,12,1,2,3,7,9,11,2,6,8,10,11,1,2,3,4,5,7,9,11,1,2,3,4,5,7,9,10、1、2、3、4、6、8、9、1、2、3、5、7、8、1、2、4、6、7、1、3、5、6、2、4、5、2、3、1]
JS Bin: http://jsbin.com/muhade/edit?js,console
如果你不熟悉ES2015,下面是ES5中的相同代码:
JavaScript (ES5)
var dist = function (a, r) {
r = r || [];
if (r.length <= a.length - 2) {
var t = [];
var b = a[r.length];
a.forEach(function (e) { return t.push(e - b); });
r.push(t.filter(function (e) { return e > 0; }));
return dist(a, r);
}
else return r;
};
var sky = [0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17];
var ter = [];
console.log(dist(sky, ter));发布于 2017-01-07 03:09:03
如果我没理解错的话,我猜你可能会这样做。
var sky = [0,3,4,5,6,7,8,9,10,11,12,14,16,17],
ters = sky.map((e,i,a) => a.slice(i+1).map(f => [e,f]))
.reduce((p,c) => p.concat(c));
console.log(JSON.stringify(ters));
或者可能是这样的;
var sky = [0,3,4,5,6,7,8,9,10,11,12,14,16,17],
ters = sky.map((e,i,a) => a.slice(i+1).map(f => f-e));
console.log(JSON.stringify(ters));
发布于 2017-01-07 03:10:16
首先,将您的问题简化为一个简单的函数
/**
* @param {Number[]} sky - The original sky array
* @param {Number} cycle - First cycle is 1, second is 2, so on..
* @param {Number} itemIndex - Index of item to take distance to
*/
function distance(sky, cycle, itemIndex) {
cycle = cycle - 1; // the first cycle is actually 0
if (cycle < 0) return Number.NaN;
if (cycle > sky.length - 2) return Number.NaN;
if (itemIndex > sky.length - cycle - 1) return Number.NaN;
return sky[itemIndex + cycle + 1] - sky[cycle];
}现在,例如,您可以检查:
var sky = [0,3,4,5,6,7,8,9,10,11,12,14,16,17];
console.log(distance(sky, 1, 7)); // 10
console.log(distance(sky, 2, 7)); // 8然后,创建ter
var sky = [0,3,4,5,6,7,8,9,10,11,12,14,16,17];
var ter = [];
for (var cycle = 0 ; cycle < sky.length - 1 ; cycle++) {
var innerTer = [];
for (var itemIndex = 0; itemIndex <= sky.length - cycle - 1 ; itemIndex++)
innerTer.push(distance(sky, cycle, itemIndex));
ter.push(innerTer);
}
console.log(ter);希望这能有所帮助。
https://stackoverflow.com/questions/41511364
复制相似问题