首页 > 解决方案 > 如何将两个数组减少为同一索引中存在的单个值?

问题描述

我有一个 D3 程序正在构建一个折线图,其中有两条线,我想确定线交叉处的坐标。D3有这个功能吗?数组通常具有不同的长度并且是动态生成的,但总是有一个值,在同一索引处两者相等。

例如

   var line1 = [0,1,2,3,4];
   var line2 = [4,3,2,1,0];

答案 = 索引 2,在这种情况下。如果没有 D3 功能,那么使用 ES6 及更高版本的最佳方法是什么?

标签: javascriptarraysd3.js

解决方案


D3 有一个非常未知的方法,名为d3.zip,我们可以使用它来合并数组并查找其中所有元素都相等的任何内部数组:

var line1 = [0, 1, 2, 3, 4];
var line2 = [4, 3, 2, 1, 0];
var zip = d3.zip(line1, line2).reduce(function(a, c, i) {
  if (c[0] === c[1]) a.push(i);
  return a;
}, []);

console.log(zip)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

好处d3.zip是它可以与多个数组一起使用,并且还保留了较短数组的长度。因此,在更复杂的情况下(索引 6 和 9 中的值相等):

var line1 = [0, 1, 2, 3, 9, 9, 1, 4, 7, 6, 5, 4];
var line2 = [4, 3, 2, 1, 0, 8, 1, 2, 3, 6, 1];
var line3 = [9, 9, 9, 9, 4, 1, 1, 1, 1, 6, 1, 1, 1, 1, 1, 1];
var zip = d3.zip(line1, line2, line3).reduce(function(a, c, i) {
  const every = c.every(function(e) {
    return e === c[0]
  })
  if (every) a.push(i);
  return a;
}, []);

console.log(zip)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>


推荐阅读