Итерация по вложенному массиву, путь es6, я уже сделал с помощью foreach - PullRequest
0 голосов
/ 06 июня 2019

Я выполнил итерацию с использованием forEach, код работает, но, пожалуйста, не могли бы вы подсказать, можно ли это сделать способом es6 и правильна ли моя реализация или нет

Я выполнил итерацию, код работает, однако я хотел бы узнать более изящный способ и правильность этой реализации

  var arrayToBeChecked = 
          [
            { name: "one",
              objectvalue : {
                        first : ['valueIamNotInterestedIn0'],
                        second :'valueIamNotInterestedIn1'
                       }
             },
             { name: "two",
               objectvalue : {
                        first : ['valueIamLookingFor'],
                        second :'valueIamNotInterestedIn5'
                       }
             },
             { name: "three",
               objectvalue : {
                        first : ['valueIamNotInterestedIn5'],
                        second :'valueIamNotInterestedIn5'
                       }
             }

          ]

   var checkBoolean = false;

   arrayToBeChecked.forEach(val => {
    let selectedArray =  val.objectvalue['first']
      if(selectedArray.indexOf('valueIamLookingFor') > -1){
         checkBoolean = true 
      }
   })

   console.log(checkBoolean)

Ответы [ 5 ]

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

Один из вариантов - сопоставить Object.values каждого элемента, сгладить массив, а затем проверить, является ли он .includes тем, что вы ищете:

var arrayToBeChecked = [{
    name: "one",
    objectvalue: {
      first: ['valueIamNotInterestedIn0'],
      second: 'valueIamNotInterestedIn1'
    }
  },
  {
    name: "two",
    objectvalue: {
      first: ['valueIamLookingFor'],
      second: 'valueIamNotInterestedIn5'
    }
  },
  {
    name: "three",
    objectvalue: {
      first: ['valueIamNotInterestedIn5'],
      second: 'valueIamNotInterestedIn5'
    }
  }

]

const checkBoolean = arrayToBeChecked
  .map(({ objectvalue }) => Object.values(objectvalue))
  .flat(2)
  .includes('valueIamLookingFor');
console.log(checkBoolean)
1 голос
/ 06 июня 2019

Вы можете взять присвоение деструктуры для получения first в сочетании с Array#some, который выходит из цикла с верным возвращаемым значением и Array#includes для проверки значения.

var arrayToBeChecked = [{ name: "one", objectvalue: { first: ['valueIamNotInterestedIn0'], second: 'valueIamNotInterestedIn1' } }, { name: "two", objectvalue: { first: ['valueIamLookingFor'], second: 'valueIamNotInterestedIn5' } }, { name: "three", objectvalue: { first: ['valueIamNotInterestedIn5'], second: 'valueIamNotInterestedIn5' } }],
    checkBoolean = arrayToBeChecked
        .some(({ objectvalue: { first } }) => first.includes('valueIamLookingFor'));

console.log(checkBoolean);
1 голос
/ 06 июня 2019

ES6 первым способом будет сопоставить массив со значениями, которые вас интересуют. А затем использовать some метод массива, чтобы определить, соответствует ли какой-либо из элементов вашим критериям.

Кроме того, вместоindexOf Вы можете использовать includes, который возвращает логическое значение.

  const checkBoolean = arrayToBeChecked
    .map(({ objectvalue }) => [...objectvalue.first, objectvalue.second ])
    .some(v => v.includes('valueIamLookingFor'));

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

Ваш текущий подход не настолько эффективен, потому что вы будете продолжать повторять даже после того, как найдете совпадение.Для такого рода проверки (смотрите, соответствует ли какое-либо из значений массива условию) вы можете использовать .some(...)

Вот пример:

var arrayToBeChecked = [{
    name: "one",
    objectvalue: {
      first: ['valueIamNotInterestedIn0'],
      second: 'valueIamNotInterestedIn1'
    }
  },
  {
    name: "two",
    objectvalue: {
      first: ['valueIamLookingFor'],
      second: 'valueIamNotInterestedIn5'
    }
  },
  {
    name: "three",
    objectvalue: {
      first: ['valueIamNotInterestedIn5'],
      second: 'valueIamNotInterestedIn5'
    }
  }

];

const result = arrayToBeChecked.some(({
  objectvalue: {
    first
  }
}) => first.includes('valueIamLookingFor'));

console.log(result);
0 голосов
/ 06 июня 2019

Вы можете просто использовать некоторые вместо forEach, поскольку вы делаете checkBoolean равным true, если какой-либо элемент соответствует

var arrayToBeChecked = [{name: "one",objectvalue: {first: ['valueIamNotInterestedIn0'],second: 'valueIamNotInterestedIn1'}},{name: "two",objectvalue: {first: ['valueIamLookingFor'],second: 'valueIamNotInterestedIn5'}},{name: "three",objectvalue: {first: ['valueIamNotInterestedIn5'],second: 'valueIamNotInterestedIn5'}}]

var checkBoolean =
  arrayToBeChecked.some(val => {
    let selectedArray = val.objectvalue['first']
    return selectedArray && selectedArray.indexOf('valueIamLookingFor') > -1
})

console.log(checkBoolean)
...