2017-02-06 11 views
1

Я пытаюсь использовать функцию array.some, чтобы перебирать некоторые данные и возвращать мой field, если инструкция if выполнена успешно.Возвращаем элемент с помощью `array.some()` вместо boolean

То, что я нахожу, происходит вместо этого, это то, что я получаю логическое возвращение, например true, вместо фактической переменной (которая содержит детали для элемента).

for (var index in allFields) { 
     const invalidField = allFields[index].some(function (field){ 
     if (!validation.getIn([index,field.dataset.fieldKey,'isValid'])) { 
      return field; 
     } 
     }); 
     if (invalidField) { 
     return invalidField; 
     } 
    } 

Мой код перебирает allFields, который содержит списки полей под индексами. Затем он сравнивает каждый fieldKey с другим набором данных, который называется validation.

field содержит элемент. Я хотел бы вернуться field, но вместо того, чтобы, когда я проверяю invalidField я получаю true вместо элемента

+1

'some' возвращает логическое значение, и если' true', он завершает итерацию. –

+2

'array.some' делает так, как запроектирован. [docs] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some) 'array.find()' [docs] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find) может быть больше того, чего вы хотите – ste2425

+0

Ваша путаница здесь может заключаться в том, что вы возвращаете 'поле', которое является элементом, который вы хотите от своего обратного вызова, но это не то, 'some' возвращается. Per [msn] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some) для возвращаемого значения: 'true, если функция обратного вызова возвращает правдивое значение для любого элемента массива ; в противном случае false. '' field' является «правдивым», поэтому 'some' возвращает' true' –

ответ

5

Array.prototype.some() проверяет только если какой-то элемент в тест прохождения массива, определенный в функции обратного вызова. Вы должны использовать метод массива find, который возвращает первый элемент passig test

+0

Просто обратите внимание, что 'find' возвращает элемент из массива, если он сопоставляется. Или 'undefined' в противном случае, так что лучше проверить, вернул ли он' undefined', прежде чем пытаться использовать это возвращаемое значение. –

1

Вы ищете Array.prototype.filter вместо Array.prototype.some.

Фильтр делает то, что вы в настоящее время ожидаете some(). some() возвращает логическое значение, если 1 или более элементов соответствуют вашим критериям, а filter() создает новый массив элементов, который соответствовал вашим критериям.

1

, чтобы получить элемент, вам нужно использовать array.filter()

for (var index in allFields) { 
    const invalidField = allFields[index].filter(function (field){ 
    if (!validation.getIn([index,field.dataset.fieldKey,'isValid'])) { 
     return field; 
    } 
    }); 
    if (invalidField.length > 0) { //check if returned anything 
    return invalidField[0]; 
    } 
} 

Если вы хотите вернуть только первый, вы можете использовать array.find()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

 Смежные вопросы

  • Нет связанных вопросов^_^