Заменить активный флаг на следующий элемент после фильтрации в Javascript - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть ответ от API, который мне нужно отфильтровать. После фильтрации мне нужно установить активный элемент. После фильтрации существует случай, когда ни один активный элемент не установлен в значение true, поскольку первоначальный активный элемент был отфильтрован. Я хочу включить следующий возможный активный элемент.

// This object array is always sorted with the same length. 
const data = [ 
  { id: 241, name: "item 1",count: 0, active: false},
  { id: 221, name: "item 2",count: 4, active: true},
  { id: 343, name: "item 3",count: 0, active: false},
  { id: 129, name: "item 3",count: 0, active: false}
]

const dataActive = data.find( el=> el.active === true);
const filtered = data.filter(el => el.count < 3);

Как изменить активный флаг элемента 3 в отфильтрованном массиве объектов на true?

Таким образом, выходные данные отфильтрованного будут:

  { id: 241, name: "item 1",count: 0, active: false},
  { id: 343, name: "item 3",count: 0, active: true},
  { id: 129, name: "item 3",count: 0, active: false}

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Кажется, это работает, но могут быть и лучшие способы сделать это.

const data = [ 
  { id: 241, name: "item 1",count: 0, active: false},
  { id: 221, name: "item 2",count: 4, active: true},
  { id: 343, name: "item 3",count: 0, active: false},
  { id: 129, name: "item 3",count: 0, active: false}
]

const dataActive = data.find( el=> el.active === true);
let isFound = false;
//you have to consider the edge cases if you take this process in consideration
const newMappedData = data.map(el => {
    if(el.active && !isFound){
      isFound = true;
      data[data.indexOf(el) + 1].active = true;
      //any kind of identifier that says the data is to be filtered out
      return false;
  }
  return el; 
});

const filtered = newMappedData.filter(el => el != false)
console.log(filtered)
1 голос
/ 18 февраля 2020

Если изменяющиеся исходные данные не будут вас беспокоить, вы можете получить необходимые побочные эффекты изнутри filter():

const data = [ 
        { id: 241, name: "item 1",count: 0, active: false},
        { id: 221, name: "item 2",count: 4, active: true},
        { id: 343, name: "item 3",count: 0, active: false},
        { id: 129, name: "item 3",count: 0, active: false}
      ],
      
      filtered = data.filter(item => 
        item.count < 3 ? 
        (shiftFlag ? (item.active = true, shiftFlag = false, true) : true) :
        (item.active ? (shiftFlag = true, item.active = false, false) : false),
        shiftFlag=false)
        
console.log(filtered)        
.as-console-wrapper{min-height:100%;}

И, конечно, вышеприведенное не сместит активный флаг на элемент следующий , если активный элемент будет go последним в массив и он должен быть отфильтрован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...