首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript查找数组中项目之间的距离

Javascript查找数组中项目之间的距离
EN

Stack Overflow用户
提问于 2017-01-07 01:48:14
回答 4查看 2.3K关注 0票数 0

我有一组数组,每个数组都有相同的长度,其中2个是排序的

我从这个变量开始: var sky = 0,3,4,5,6,7,8,9,10,11,12,14,16,17;var ter = [];

我必须以这种方式分析每个天空项目:对于每个天空项目,我必须找到天空项目和sky+1之间的“距离”,然后从天空项目和sky+1+1等。所以

代码语言:javascript
运行
复制
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

因此,天空阵列的第二个循环必须做同样的事情,但从天空阵列上的第二个项目开始,因此将是

代码语言:javascript
运行
复制
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变量,在这一点上,也许最好的方法是将它放在数组中,就像这样

代码语言:javascript
运行
复制
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,因为我没有任何关于天空数组最后一项的东西

代码语言:javascript
运行
复制
for (j = 0; j < sky.length; j++) {
  if (j !== 0 || j !== sky.length){
    ter.push(sky[j]-sky[0]);
  }
}

console.log(ter);

有什么快速的想法吗?

EN

回答 4

Stack Overflow用户

发布于 2017-01-07 02:37:08

我认为在这种情况下,递归比迭代更有效。

JavaScript (ES2015)

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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));
票数 0
EN

Stack Overflow用户

发布于 2017-01-07 03:09:03

如果我没理解错的话,我猜你可能会这样做。

代码语言:javascript
运行
复制
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));

或者可能是这样的;

代码语言:javascript
运行
复制
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));

票数 0
EN

Stack Overflow用户

发布于 2017-01-07 03:10:16

首先,将您的问题简化为一个简单的函数

代码语言:javascript
运行
复制
/**
 * @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];
}

现在,例如,您可以检查:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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);

JSFIDDLE DEMO

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41511364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档