在具有不同对象名称的多维数组数组中查找最大值

问题描述 投票:0回答:2

这是当前代码和较大数组的一部分:

function Initialize() {
    ARR[127][1][0] = {name:"Gl", ss:["Z0",127,"B0",1,[58,0]], delay:{first:60, term:220, slow:240, med:188, fast:188}};
    ARR[127][127][0] = {name:"Gl Co", ss:["Z0",127,"B0",127,[58,0]], delay:{first:60, term:220, slow:240, med:188, fast:188}};
    ARR[127][1][6] = {name:"Gl El", ss:["Z0",127,"B0",1,[58,6]], delay:{first:60, term:310, slow:360, med:245, fast:145}};
    ARR[127][127][6] = {name:"Gl El Co", ss:["Z0",127,"B0",127,[58,6]], delay:{first:60, term:310, slow:330, med:245, fast:145}}
}

var ARR = new Array(128);
for (let val1 = 0; val1 < ARR.length; val1++) {
  ARR[val1] = new Array(128);
  for (let val2 = 0; val2 < ARR[val1].length; val2++) {
    ARR[val1][val2] = new Array(128);
    for (let val3 = 0; val3 < ARR[val1][val2].length; val3++) {
      ARR[val1][val2][val3] = [];
    }
  }
}

Initialize();

var maxValue = 0;

for (let i = 0; i < ARR.length; i++) {
  for (let j = 0; j < ARR[i].length; j++) {
    for (let k = 0; k < ARR[i][j].length; k++) {
      for (let l = 0; l < ARR[i][j][k].length; l++) {
        maxValue = Math.max(...Object.values(ARR[i][j][k].delay))
      }
    }
  }
}

console.log(maxValue);

我正在寻找

.delay
对象中的最大值 - 从所有行中。在本例中为 360。

我看过不同的方法,但它们似乎都是针对具有相同对象的对象数组,但

.delay
中的每个对象都有不同的名称。

javascript arrays multidimensional-array
2个回答
0
投票

正如同事在评论中正确提到的那样,您需要利用三件事:

  1. 创建一个数组或映射(在此版本的实现中)以仅跟踪初始化值
  2. Map 用于将序列化坐标保存为键 (x,y,z) 和 值是相应的数据对象。它将使您避免 嵌套数组并使用 Map 的功能来创建 高效查找。
  3. 利用 Math.max 函数查找子集中的最大值

InitializeMap函数:

创建一个以

key
作为坐标字符串和相应值的变换集。

function InitializeMap() {
    const entries = [
        { x: 127, y: 1, z: 0, data: {name:"Gl", ss:["Z0",127,"B0",1,[58,0]], delay:{first:60, term:220, slow:240, med:188, fast:188}}},
        { x: 127, y: 127, z: 0, data: {name:"Gl Co", ss:["Z0",127,"B0",127,[58,0]], delay:{first:60, term:220, slow:240, med:188, fast:188}}},
        { x: 127, y: 1, z: 6, data: {name:"Gl El", ss:["Z0",127,"B0",1,[58,6]], delay:{first:60, term:310, slow:360, med:245, fast:145}}},
        { x: 127, y: 127, z: 6, data: {name:"Gl El Co", ss:["Z0",127,"B0",127,[58,6]], delay:{first:60, term:310, slow:330, med:245, fast:145}}}
    ];

    entries.forEach(entry => {
        const key = `${entry.x},${entry.y},${entry.z}`;
        ARR_Map.set(key, entry.data.delay); // Store only delay objects
    });
}

搜索最大值

迭代变换后的映射并搜索每组中的最大值。然后找出最大的值。

// Function to find the maximum delay using Map
function findMaxDelayUsingMap(arrMap) {
    let maxDelay = -Infinity;
    for (let delayObj of arrMap.values()) {
        const localMax = Math.max(...Object.values(delayObj).filter(val => typeof val === 'number'));
        if (localMax > maxDelay) {
            maxDelay = localMax;
        }
    }
    return maxDelay;
}

完整代码示例:

// Initialize a Map to store only initialized entries
const ARR_Map = new Map();

// Modified Initialize function to use Map
function InitializeMap() {
    const entries = [
        { x: 127, y: 1, z: 0, data: {name:"Gl", ss:["Z0",127,"B0",1,[58,0]], delay:{first:60, term:220, slow:240, med:188, fast:188}}},
        { x: 127, y: 127, z: 0, data: {name:"Gl Co", ss:["Z0",127,"B0",127,[58,0]], delay:{first:60, term:220, slow:240, med:188, fast:188}}},
        { x: 127, y: 1, z: 6, data: {name:"Gl El", ss:["Z0",127,"B0",1,[58,6]], delay:{first:60, term:310, slow:360, med:245, fast:145}}},
        { x: 127, y: 127, z: 6, data: {name:"Gl El Co", ss:["Z0",127,"B0",127,[58,6]], delay:{first:60, term:310, slow:330, med:245, fast:145}}}
    ];

    entries.forEach(entry => {
        const key = `${entry.x},${entry.y},${entry.z}`;
        ARR_Map.set(key, entry.data.delay); // Store only delay objects
    });
}
 
InitializeMap();

// Function to find the maximum delay using Map
function findMaxDelayUsingMap(arrMap) {
    let maxDelay = -Infinity;
    for (let delayObj of arrMap.values()) {
        const localMax = Math.max(...Object.values(delayObj).filter(val => typeof val === 'number'));
        if (localMax > maxDelay) {
            maxDelay = localMax;
        }
    }
    return maxDelay;
}

let maximumDelayMap = findMaxDelayUsingMap(ARR_Map);
console.log("The maximum delay using Map is:", maximumDelayMap);

0
投票
  • 您需要将现有
    maxValue
    与当前
    .delay
    对象的最大值进行比较。
  • 您应该将所有元素初始化为对象,而不是数组。
  • 您需要检查当前元素是否具有
    .delay
    属性。
  • 您有一个不需要的额外嵌套循环
    (for let l ...)
    。你从来没有使用过
    l

function Initialize() {
    ARR[127][1][0] = {name:"Gl", ss:["Z0",127,"B0",1,[58,0]], delay:{first:60, term:220, slow:240, med:188, fast:188}};
    ARR[127][127][0] = {name:"Gl Co", ss:["Z0",127,"B0",127,[58,0]], delay:{first:60, term:220, slow:240, med:188, fast:188}};
    ARR[127][1][6] = {name:"Gl El", ss:["Z0",127,"B0",1,[58,6]], delay:{first:60, term:310, slow:360, med:245, fast:145}};
    ARR[127][127][6] = {name:"Gl El Co", ss:["Z0",127,"B0",127,[58,6]], delay:{first:60, term:310, slow:330, med:245, fast:145}}
}

var ARR = new Array(128);
for (let val1 = 0; val1 < ARR.length; val1++) {
  ARR[val1] = new Array(128);
  for (let val2 = 0; val2 < ARR[val1].length; val2++) {
    ARR[val1][val2] = new Array(128);
    for (let val3 = 0; val3 < ARR[val1][val2].length; val3++) {
      ARR[val1][val2][val3] = {};
    }
  }
}

Initialize();

var maxValue = 0;

for (let i = 0; i < ARR.length; i++) {
  for (let j = 0; j < ARR[i].length; j++) {
    for (let k = 0; k < ARR[i][j].length; k++) {
      if (ARR[i][j][k].delay) {
        maxValue = Math.max(maxValue, ...Object.values(ARR[i][j][k].delay));
      }
    }
  }
}

console.log(maxValue);

© www.soinside.com 2019 - 2024. All rights reserved.