当前位置: 首页 > 知识库问答 >
问题:

javascript - js便利数组,得到个二维数组[[最小值,最小值],[最大值,最大值]]?

龙飞
2024-01-10
var newArr = [{    "imgUrl":"http://jcyj.mem.cegn.cn/gw/dwa-micro-file-simple/api/file/download/ae8dbd89-252d-4fd7-9cb2-098fb92e454b",    "arr":[[39.867638888888884,116.39333333333333],[50.97152777777777,110.31527777777778]]},{    "imgUrl":"http://jcyj.mem.cegn.cn/gw/dwa-micro-file-simple/api/file/download/ae8dbd89-252d-4fd7-9cb2-098fb92e454b",    "arr":[[40.867638888888884,115.39333333333333],[40.97152777777777,120.31527777777778]]},{"imgUrl":"","arr":[[],[]]},{"imgUrl":"","arr":[[],[]]},{"imgUrl":"","arr":[[],[]]},{"imgUrl":"","arr":[[],[]]}];

计算newArr数组所有对象中arr二维数组,比较后返回其中的[[最小值,最小值],[最大值,最大值]];
要这种结果[[39.867638888888884, 115.39333333333333], [50.97152777777777, 120.31527777777778]]

共有3个答案

茅鸿宝
2024-01-10

个人理解第一列中求最最小,第二列中求最大

const newArr = [  {    arr: [      [39.867638888888884, 116.39333333333333],      [50.97152777777777, 110.31527777777778]    ]  },  {    arr: [      [40.867638888888884, 115.39333333333333],      [40.97152777777777, 120.31527777777778]    ]  }]const result = newArr  .map(item => item.arr)  .reduce(    (prev, curr) => {      const [minArr, maxArr] = prev      const [col1, col2] = curr        // 第一列求最小值      ;[minArr[0], minArr[1]] = [        Math.min(minArr[0] || Infinity, col1[0]),        Math.min(minArr[1] || Infinity, col1[1])      ]        // 第二列求最大值      ;[maxArr[0], maxArr[1]] = [        Math.max(maxArr[0] || -Infinity, col2[0]),        Math.max(maxArr[1] || -Infinity, col2[1])      ]      return [minArr, maxArr]    },    [[], []]  )console.log(result)/*[ [ 39.867638888888884, 115.39333333333333 ],  [ 50.97152777777777, 120.31527777777778 ] ]*/
萧远
2024-01-10
const allArr = newArr.flatMap(({ arr }) => arr);const allX = allArr.map(([x]) => x);const allY = allArr.map(([_, y]) => y);const result = [[Math.min(...allX), Math.min(...allY)], [Math.max(...allX), Math.max(...allY)]];

或者用 lodash

const result = _(newArr).flatMap(({ arr }) => arr)    .unzip()    .map(list => [_.min(list), _.max(list)])    .unzip()    .value();

下面是原答案,理解错了,以为是要分别计算每组里的最大/最小。留着供参考

看原数据 arr 中只有两个点坐标,其实是不需要遍历的。但是既然要遍历,可以先把所有横坐标和纵坐标分别分组,方便计算最大最小值

const result = newArr.map(({ imgUrl, arr }) => {    const xx = arr.map(([x]) => x);    const yy = arr.map(([_, y]) => y);    return {        imgUrl,        arr: [            [Math.min(...xx), Math.min(...yy)],            [Math.max(...xx), Math.max(...yy)]        ]    };});

当然,计算 xx 和 yy 分别遍历了两次,可以用一个 reduce 来完成一次遍历,但这不一定会更快

    const [xx, yy] = arr.reduce(([xx, yy], [x, y]) => {        xx.push(x);        yy.push(y);        return [xx, yy];    }, [[], []]);

也可以把后面的最大小最值一并算出来,在一个 reduce/for 完成

const result = newArr.map(({ imgUrl, arr }) => {    let [minx, miny] = arr[0];    let [maxx, maxy] = arr[0];    for (let i = 1; i < arr.length; i++) {        const [x, y] = arr[i];        if (x < minx) { minx = x; }        if (x > maxx) { maxx = x; }        if (y < miny) { miny = y; }        if (y > maxy) { maxy = y; }    }    return {        imgUrl,        arr: [[minx, miny], [maxx, maxy]]    };});

如果每组数据的 arr 都只有两个坐标(我就当是坐标了),那就不用去遍历,直接给值就好

const result = newArr.map(({ imgUrl, arr }) => {    const [p1, p2] = arr;    return {        imgUrl,        arr: [            [Math.min(p1[0], p2[0]), Math.min(p1[1], p2[1])],            [Math.max(p1[0], p2[0]), Math.max(p1[1], p2[1])],        ]    };});

甚至可以应用更复杂一点的解构:

const result = newArr.map(({ imgUrl, arr }) => {    const [[x1, y1], [x2, y2]] = arr;    return {        imgUrl,        arr: [            [Math.min(x1, x2), Math.min(y1, y2)],            [Math.max(x1, x2), Math.max(y1, y2)],        ]    };});
岳炎彬
2024-01-10

在JavaScript中,可以使用Math对象的minmax方法以及apply函数来找出数组中的最小值和最大值。然后,你可以使用这些最小值和最大值来创建一个新的二维数组。

以下是一个可能的解决方案:

var newArr = [    {        "imgUrl":"http://jcyj.mem.cegn.cn/gw/dwa-micro-file-simple/api/file/download/ae8dbd89-252d-4fd7-9cb2-098fb92e454b",        "arr":[[39.867638888888884,116.39333333333333],[50.97152777777777,110.31527777777778]]    },    {        "imgUrl":"http://jcyj.mem.cegn.cn/gw/dwa-micro-file-simple/api/file/download/ae8dbd89-252d-4fd7-9cb2-098fb92e454b",        "arr":[[40.867638888888884,115.39333333333333],[40.97152777777777,120.31527777777778]]    },    {        "imgUrl":"",        "arr":[[],[]]    },    {        "imgUrl":"",        "arr":[[],[]]    },    {        "imgUrl":"",        "arr":[[],[]]    },    {        "imgUrl":"",        "arr":[[],[]]    }];// 遍历每个对象的数组,获取每个数组中的最小值和最大值,然后找到全局的最小值和最大值。var minArr = newArr[0].arr[0].map(function(item) {     return Math.min.apply(null, newArr.map(function(obj) { return obj.arr[0].map(function(val) { return val[0]; }) })); }); var maxArr = newArr[0].arr[0].map(function(item) {     return Math.max.apply(null, newArr.map(function(obj) { return obj.arr[0].map(function(val) { return val[1]; }) })); }); // 使用最小值和最大值创建一个新的二维数组。var result = [[minArr, maxArr]];console.log(result); // [[[39.867638888888884, 115.39333333333333], [50.97152777777777, 120.31527777777778]]]

这段代码首先获取每个数组中的最小值和最大值,然后找到全局的最小值和最大值。最后,使用这些最小值和最大值创建一个新的二维数组。

 类似资料:
  • 主要内容:普通算法,分治算法程序中,我们经常使用数组(列表)存储给定的线性序列(例如 {1,2,3,4}),那么如何查找数组(序列)中的最大值或者最小值呢? 查找数组(序列)中最大值或最小值的算法有很多,接下来我们以 {3,7,2,1} 序列为例讲解两种查找最值的算法,一种是普通算法,另一种是借助 分治算法解决。 普通算法 普通算法的解决思路是:创建两个变量 max 和 min 分别记录数组中的最大值和最小值,它们的初始值都

  • 问题内容: 我的代码没有给出错误,但是没有显示最小值和最大值。代码是: 我是否需要system.out.println()来显示它,否则返回应该起作用吗? 问题答案: 您正在调用方法,但不使用返回的值。

  • 这是一个非常基本的算法(不能再简单了),但我被难住了。我们有一个元素数组,我们必须确定最小值和最大值。 通常的方法是遍历数组,找出最小值和最大值,即2n比较。 稍微有效的方法是首先对数组的连续元素进行比较,以确定任意两个元素的最大值和最小值(N/2比较)。我们现在有n/2 min和n/2 max元素。现在我们可以在n/2+n/2+n/2(前一步)=3/2*n或1.5n中得到最终的max和min 那

  • 问题内容: 这个问题已经在这里有了答案 : 使用Java在原始数组中查找最大值/最小值 (15个答案) 5年前关闭。 这是我的代码。我需要获取数组的最小值,最大值才能为我获取范围,无论何时输入数字,最小值均为0。请帮助我。谢谢:) 问题答案: 同样,通过更改较小的符号可以找到最小值。

  • 问题内容: 我想输出二维数组的最大值和最小值。Max可以很好地工作,但是即使在数组中没有零的情况下min也总是输出零。在本例中,我设置为99以防止较小的机会在数组中获得零。继承人完整代码: 问题答案: 由于您在中选择随机值的方式,不会存在小于零的值- 但也无法保证任何值都将恰好为零。但是,您将初始化为零,因为这是数组元素的默认值;没有什么比这更小了,所以答案总是零。 您应该在标记为“查找最小值”的

  • 我想从数组的一部分找到最大值和最小值。我知道我可以通过复制数组将所需的数组部分复制到另一个数组中,但只是想知道是否可以不复制数组,因为我必须为不同的子数组进行循环 例如: 现在我想从1到4找到子数组的最小/最大值(如果可能,不复制子数组)