#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. вам нужно только два элемента в последовательности. к вашему сведению: дополнительный оператор цепочки
?.