【问题标题】:foreach loop not working when iterating over object properties from an array of objects [javascript]迭代对象数组中的对象属性时,foreach 循环不起作用 [javascript]
【发布时间】:2019-04-25 09:38:07
【问题描述】:

我有一个包含对象数组的变量“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...

【问题讨论】:

  • 请分享您的对象数组
  • sctrLengthmaxWidth 声明在哪里......顺便说一下,逻辑看起来有点错误 - 这两个循环正在做完全不同的事情
  • absoluteEndM 似乎是一个数字。那么...为什么你认为一个数字有.forEach() 方法?
  • @Andreas - 或者......它是一个数组,你为什么要将它与一个数字进行比较:p
  • LaterArr.forEach(layer =&gt; console.log(layer))

标签: javascript for-loop foreach


【解决方案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)
}

这个 sn-p 应该可以工作(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

【讨论】:

  • 我不知道为什么,但是当我运行它时,它在“for (let layer of layerArr)”中的“of”出现错误
  • 您能否提供更多有关该错误的信息?
  • 它只是说“预期的';'”,我当然添加了;但没有区别
  • 您可能需要将for (let layer of layerArr) 替换为for (var i = 1; i &lt; layerArr.length; i++)layer. 引用layer[i].。代码是用最新“版本”的JS编写的,可能是你的运行时不支持。
  • 非常感谢。那行得通,我只需将其稍微更改为: for (var i = 1; i sctrLength ? layerArr[i].absoluteEndM : sctrLength; }
【解决方案2】:

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

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)

【讨论】:

  • 谢谢你,我不确定你是否理解正确,如果我不够清楚,对不起。我有一个对象数组(layerArr[0]、layerArr[1]、layerArr[2] 等)。这些对象中的每一个都有一个“absoluteEndM”属性,它是一个数字。我想检查每个 LayerArr[i] 对象的 absoluteEndM 的值,看它是否大于 sctrLength。 (见上面的编辑注释)
  • @NickyLarson 我正在努力看看代码无法解决您遇到的问题。在上面的代码中,LayerArr 是一个具有absoluteEndM 属性的对象数组。上面的代码检查每个absoluteEndM 值和sctrLength,并返回最大值。也许您可以进一步解释一下?
  • @NickyLarson 我的代码给出的结果与接受的答案相同,所以我很难找出这个问题出在哪里
  • 对不起,我不知道为什么,但它告诉我有一个语法错误: const maxWithDefault = defaultValue => items => Math.max(...[...items, defaultValue ])
  • 代码 sn-p 显然在我在浏览器中运行时有效,所以我不确定为什么它对我不起作用
猜你喜欢
  • 2016-12-28
  • 2015-08-29
  • 2015-03-26
  • 2014-01-12
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 2013-03-28
  • 2016-02-26
相关资源
最近更新 更多