как проверить, совпадают ли значения object.values в массиве в последовательности

#javascript #arrays #reactjs #sorting

Вопрос:

У меня есть случай в моем приложении react, в котором я должен проверить, совпадают ли значения объекта в массиве последовательно, а их другое свойство увеличивается в квадрате на 1, а затем, если критерии выполнены, переместите его в новый массив. Количество последовательных значений задается из входных данных.

Например, пользователь хочет переместить 4 объекта в новый массив, которые имеют свои "status": true

 objects =  [
{
"someID": 0,
"status": false,
},
{
"someID": 1,
"status": false,
},
{
"someID": 2,
"status": true,
},
{
"someID": 3,
"status": true,
},
{
"someID": 4,
"status": true,
},
{
"someID": 6,
"status": true,
},
{
"someID": 7,
"status": false,
},
{
"someID": 8,
"status": false,
},
{
"someID": 9,
"status": true,
},
{
"someID": 10,
"status": true,
},
{
"someID": 11,
"status": true,
},
{
"someID": 12,
"status": true,
},

]
 

из моего примера объекты с некоторыми значениями 2, 3, 4, 6 соответствуют критериям status: true , но их someID значения не увеличиваются последовательно на 1. с другой стороны, объекты с someID 9, 10, 11, 12 имеют status значение true, и их someID значения последовательно увеличиваются на 1. Таким образом, результат должен быть

 newArray = [
{
"someID": 9,
"status": true,
},
{
"someID": 10,
"status": true,
},
{
"someID": 11,
"status": true,
},
{
"someID": 12,
"status": true,
},
]
 

Комментарии:

1. каким должен быть результат здесь?

2. массив с объектами, которые удовлетворяют требованию, для примера, который я привел, это будет newArray = [ {«someID»: 2,»статус»: истина,}, {«someID»: 3,»статус»: истина,}, {«someID»: 4,»статус»: истина,}, ]

3. какой результат ожидается для таких случаев, как 2 раза подряд? у вас есть [2,3] и [3,4], которые полностью удовлетворяют условию, каков будет результат? Вы хотите, чтобы первая последовательность возвращалась только в том случае, если у вас есть несколько совпадений? и основано ли это только на определенном свойстве объекта или оно должно соответствовать свойству, и все остальные реквизиты (кроме someID) должны совпадать?

4. с нескольких матчах впервые столкнулся достаточно, на самом деле я неверно задал вопрос и сейчас я понимаю, дело заключается в том, что объект толкнул в новый массив должен иметь тот же статус имущества и someID стоимости имущества должна увеличиваться последовательно, т. е. нам нужно 4 (по-прежнему исходит от пользователя, может быть 4, но может быть 3 или 1 или 5) объекты в последовательности "status": true и "someID" , чтобы быть последовательным как [0,1,2,3] или [3,4,5,6], но не [3,4,6,7] даже когда их состояние является истинной в последовательности @buzatto

Ответ №1:

ниже приведена универсальная функция, которая принимает ваш массив и выполняет итерацию по циклу for. вы передаете свойство и ожидаемое совпадающее значение, точно так же, как ожидаемое точное количество в последовательности:

 const getSequence = (arr, count, key = 'status', value = true, id = 'someID') => {
  let match = []
  const isIDIncremental = (obj) => {
    if(match.length === 0) return true
    return obj[id] - 1 === match[match.length - 1][id]
  }

  for(const obj of arr) {
    if(match.length === count) break
    if(obj[key] === value amp;amp; isIDIncremental(obj)) {
      match.push(obj)
    } else {
      match = []
    }
  }
  
  return match.length === count ? match : []
}
 

Ответ №2:

Вы могли бы проверить status и предшественника или преемника.

 const
    objects = [{ someID: 0, status: true }, { someID: 1, status: false }, { someID: 2, status: true }, { someID: 3, status: true }, { someID: 4, status: true }, { someID: 5, status: false }, { someID: 6, status: false }, { someID: 7, status: true }],
    result = objects.filter(({ someID, status }, i, a) => status amp;amp; (
        a[i - 1]?.status amp;amp; a[i - 1]?.someID === someID - 1 ||
        a[i   1]?.status amp;amp; someID   1 === a[i   1]?.someID
    ));

console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

Комментарии:

1. Если я не ошибаюсь , это работает только в том случае, если мне нужно 3 раза true , но будет ли это работать, когда я хочу, чтобы было 4 или 5 объектов в последовательности true ?, количество объектов с "status": true последовательностью указано из input . Я все еще неопытен, не могли бы вы сказать мне, что ? делает в этой ситуации a[i - 1]?.status ?

2. вам нужно только два элемента в последовательности. к вашему сведению: дополнительный оператор цепочки ?.