цикл foreach не работает при переборе свойств объекта из массива объектов [javascript] - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть переменная 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 ]

1 голос
/ 25 апреля 2019
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
0 голосов
/ 25 апреля 2019

Немного сложно точно определить, что вам нужно из вашего вопроса, но кажется, что вы хотите выяснить максимальное значение для 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...