Для в и Object.keys - ES6 - PullRequest
       12

Для в и Object.keys - ES6

0 голосов
/ 08 июня 2019

Разве эти две функции не должны возвращать одно и то же? Поскольку это дает мне ForInStatement не допускается ограничение синтаксиса, в то время как Object.keys дает мне совершенно другой результат. Как только он возвращает false, почему он снова зацикливается?

Я хочу проверить, является ли какой-либо из элементов объекта нулевым или пустым. Как только он возвращает false, почему он все еще зацикливается в Object.keys? Находясь в ForIn, он возвращает false, и цикл останавливается, как только в объекте обнаруживается пустой элемент.

Для В

checkEmpty = (obj) => {
    for (const key in obj) {
      if (obj[key] === null || obj[key] === '') {
        console.log('forIn', obj[key] === null || obj[key] === '');
        return false;
      }
    }
    return true;
}

Object.keys

checkEmpty = (obj) => {
    Object.keys(obj).forEach(key => {
          if (obj[key] === null || obj[key] === '') {
            console.log('forEach', obj[key] === null || obj[key] === '');
            return false;
          }
    });
    return true;
}

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Array.forEach() возвращаемое значение игнорируется, и вы не можете разорвать цикл, как в for...in.В вашем случае вы можете использовать Array.some() для возврата результата, как только проверка не пройдет.

Примечание 1 : Array.some() будет возвращать true всякий раз, когдачек возвращает true.Array.every() вернет true, только если все проверки вернутся true.

Примечание 2 : Идея, лежащая в основе вашей функции, кажется возвращаемой true, если есть хотя бы одно значение null или '', но ваш код делает обратное.Вы можете отменить результат моей функции, чтобы получить false, когда есть пустой элемент.

Примечание 3 : есть еще одна разница между Array.keys/values/entries сArray.forEach() и цикл for...in.Цикл for...in также будет зацикливать все унаследованные перечисляемые свойства, в то время как методы Object.x() будут выполнять итерации только своих перечисляемых свойств.

// use object values, I use Object.entries to show the key in the console
const checkHasEmpty = obj => Object.entries(obj).some(([key, value]) => console.log(`key: ${key}`) || value === null || value === '')

console.log(checkHasEmpty({}))

console.log(checkHasEmpty({ a: 1, b: null, c: 3 }))

console.log(checkHasEmpty({ a: '', b: 2 }))

console.log(checkHasEmpty({ a: 1, b: 2, c: null }))
0 голосов
/ 08 июня 2019

Кажется, что во втором фрагменте ошибка здесь

Object.keys(obj).forEach(key => {
          if (obj[key] === null || obj[key] === '') {

forEach примет аргумент как (item,index), где item - элемент массива, а index - текущий индекс вмассив.

Таким образом, obj[key] попытается получить элемент в массиве, указанный ключом, который также может быть неопределенным

Попробуйте заменить obj[key] только на key или obj[index]

Object.keys(obj).forEach(key => {
          if (key === null || key === '') {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...