从对象数组中迭代对象属性时,foreach循环不起作用[javascript]

时间:2019-04-25 09:38:07

标签: javascript for-loop foreach

我有一个变量“ layerArr”,其中包含对象数组。每个都有自己的属性。

我希望遍历每个对象的'absoluteEndM'属性,以检查其值是否大于sctrLength的值,然后根据答案进行操作。我尝试了以下方法:

       LayerArr[i].absoluteEndM.forEach(function (endMtr)
        {
            if (endMtr > sctrLength) {
                maxWidth = endMtr;
            }
            else {
                maxWidth = sctrLength;
            } 
        })

       for (var i = 0; i < LayerArr.length; i++) {
            if (LayerArr[j].absoluteEndM > sctrLength) {
                maxWidth = LayerArr[j].absoluteEndM;
            }
            else {
                maxWidth = sctrLength;
            } 
        }

都不起作用,我不确定为什么。正确的方法是什么?谢谢

编辑:layerArr包含以下对象:

layerArr [0],LayerArr [1],LayerArr [2]和LayerArr [3](它们只是编号,没有名称)

其中每个都有很多属性,例如:

layerArr[0].endDate
layerArr[0].cracked
layerArr[0].absoluteEndM
etc...

和:

layerArr[1].endDate
layerArr[1].cracked
layerArr[1].absoluteEndM
etc...

我不确定该如何解释

2 个答案:

答案 0 :(得分:1)

const layerArr = [
    { absoluteEndM: 2 },
    { absoluteEndM: 4 },
    { absoluteEndM: 1 }
]

const sctrLength = 3;
let maxWidth = 0;

for (let layer of layerArr) {
    maxWidth = layer.absoluteEndM > sctrLength ? layer.absoluteEndM : sctrLength
    console.log(maxWidth)
}

该代码段应该可以工作(ES6,您可能需要将其转换为ES5或自己做一些工作)。

但是代码本身的功能有点奇怪,实际上您在maxWidth中得到了一个不具有代表性的值。您可以创建一个像这样的数组:

const maxWidths = layerArr.map(layer => layer.absoluteEndM > sctrLength ? layer.absoluteEndM : sctrLength)
console.log(maxWidths)

一个示范:

const layerArr = [
	{ absoluteEndM: 2 },
	{ absoluteEndM: 4 },
	{ absoluteEndM: 1 }
]

const sctrLength = 3;
let maxWidth = 0;

// Start of example 1 - just setting the maxWidth
for (let layer of layerArr) {
	maxWidth = layer.absoluteEndM > sctrLength ? layer.absoluteEndM : sctrLength
	console.log(maxWidth)
}
// End of example 1

// Start of example 2 - making an array of maxWidths
const maxWidths = layerArr.map(layer => layer.absoluteEndM > sctrLength ? layer.absoluteEndM : sctrLength)
console.log(maxWidths)
// End of example 2

答案 1 :(得分:0)

要准确地从问题中说出您需要什么有点棘手,但是看来您想要做的是从对象数组中确定absoluteEndM的最大值,但还要包括该值sctrLength中的。这可能是这样的:

const LayerArr = [
  {
    absoluteEndM: 2,
  },
  {
    absoluteEndM: 4,
  },
  {
    absoluteEndM: 1,
  },
]

const sctrLength = 3

const maxWithDefault = defaultValue => items => Math.max(...[...items, defaultValue])
const maxIncludingSctrLength = maxWithDefault(sctrLength)
const path = k => x => x[k]
const getAbsoluteEndM = path('absoluteEndM')

const getMaxAbsoluteEndM = _layers =>
    maxIncludingSctrLength(_layers.map(getAbsoluteEndM))

const result = getMaxAbsoluteEndM(LayerArr)

console.dir(result)