Фильтрация массива по параметру - PullRequest
0 голосов
/ 07 августа 2020

У меня есть массив:

const submissions = [
  {
    question: 'blah blah blah ?',
    response: 'blah blah blah',
    isCorrect: true,
    isEssayQuestion: false
  },
  {
    question: 'blah blah blah blah',
    response: 'blah blah blah',
    isCorrect: true,
    isEssayQuestion: false
  },
  {
    question: 'blah blah blah ?',
    response: 'blah blah blah blah',
    isCorrect: true,
    isEssayQuestion: true
  },
  {
    question: 'True or False: I am new to JS.',
    response: 'True',
    isCorrect: true,
    isEssayQuestion: false
  }
];

Функция принимает массив представлений и логический параметр.

function filterQuestionsByType(submissions, essayquestion) {

  let trueEssay = [];
  let falseEssay = []; 

  for (let i = 0; i < submissions.length; i++) {
    if ( essayquestion === true) {
      if ( submissions[i].isEssayQuestion === true) {
        trueEssay.push(submissions[i]);
      } else {
        falseEssay.push(submissions[i]);
      }
    } 
  }

  if (essayquestion === true) {
    return trueEssay;
  } else {
    return falseEssay;
  }
}

Если true, мне нужно вернуть массив со всеми записями, где isEssayQuestion верно. Если false, то то же самое. Это будет верно, но не ложно. Мысли?

Ответы [ 3 ]

3 голосов
/ 07 августа 2020

Array.prototype.filter() идеально подходит для этой цели:

const src = [{question:'blah blah blah ?',response:'blah blah blah',isCorrect:true,isEssayQuestion:false},{question:'blah blah blah blah',response:'blah blah blah',isCorrect:true,isEssayQuestion:false},{question:'blah blah blah ?',response:'blah blah blah blah',isCorrect:true,isEssayQuestion:true},{question:'True or False: I am new to JS.',response:'True',isCorrect:true,isEssayQuestion:false}],

    filterQuestionsByType = (submissions, essayquestions) => 
      submissions.filter(({isEssayQuestion}) => isEssayQuestion == essayquestions)
      
console.log(filterQuestionsByType(src, true))
1 голос
/ 07 августа 2020

Ну просто используйте метод .filter для этого случая

const submissions = [
  {
    question: 'blah blah blah ?',
    response: 'blah blah blah',
    isCorrect: true,
    isEssayQuestion: false
  },
  {
    question: 'blah blah blah blah',
    response: 'blah blah blah',
    isCorrect: true,
    isEssayQuestion: false
  },
  {
    question: 'blah blah blah ?',
    response: 'blah blah blah blah',
    isCorrect: true,
    isEssayQuestion: true
  },
  {
    question: 'True or False: I am new to JS.',
    response: 'True',
    isCorrect: true,
    isEssayQuestion: false
  }
];

function essays(essay, question) {
   return essay.filter(({isEssayQuestion}) => isEssayQuestion === question)
}

console.log(essays(submissions, false));
console.log("------------------------------------");
console.log(essays(submissions, true));
0 голосов
/ 07 августа 2020

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

const submissions = [
  {
    question: 'blah blah blah ?',
    response: 'blah blah blah',
    isCorrect: true,
    isEssayQuestion: false
  },
  {
    question: 'blah blah blah blah',
    response: 'blah blah blah',
    isCorrect: true,
    isEssayQuestion: false
  },
  {
    question: 'blah blah blah ?',
    response: 'blah blah blah blah',
    isCorrect: true,
    isEssayQuestion: true
  },
  {
    question: 'True or False: I am new to JS.',
    response: 'True',
    isCorrect: true,
    isEssayQuestion: false
  }
];

const sortedValues = {
  trueValues: [],
  falseValues: []
}


submissions.map(item => {
  sortedValues[`${item.isEssayQuestion}Values`] = [...sortedValues[`${item.isEssayQuestion}Values`], item]
})

console.log(JSON.stringify(sortedValues, 2,2))
...