Как мне отфильтровать массив, который иногда имеет значение null?

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я хочу отфильтровать массив и получить только те значения, для которых значение HasAccess равно false. Единственная проблема заключается в том, что HasAccess не всегда существует. Иногда значение Settings равно null. Как я могу этим управлять?

     0:{
ClientCodeRegional: (2) ["29000-A", "122214"]
CreatedUpdatedBy: null
Email: "testuserthree@for.deletion"
Id: "11ad1dfb-3cd6-4db6-87a9-8063bb12504d"
Settings: {
          CsmPassword: ""
          CsmUser: ""
          HasAccess: false
          IsAdmin: true
          IsInternal: false
          IsLocked: true
          MarketAreaCode: ""
          Role: "Administrator"
          Updated: null
          UpdatedBy: null
          UserId: "11ad1dfb-3cd6-4db6-87a9-8063bb12504d"
          }
}
  

Я перепробовал много разных вещей, но это то, что я получил на данный момент.

 const users = result.data.filter((number) => {

          //number.Settings != null
           if (typeof number.Settings == "null") {
            return true;
          } else {
            return number;
          }
          })
  

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

1. Вы возвращаете true, если Setting == «null», это означает, что этот элемент не должен отфильтровываться, если он равен «null», также «null» не совпадает с null.

2. стоит отметить, что в JS существует известная и давняя ошибка, из-за которой typeof null возникает "object" . На самом деле никакого значения x не имеет typeof x == "null"

3. @chriss — OP использует typeof .

4. Sry missread но спасибо вам обоим за указание, другая проблема с всегда возвращаемым значением, то есть без фильтрации, все еще актуальна

Ответ №1:

Если вы хотите получить все записи, для которых Settings.HasAccess определено и является false , используйте логическое и ( amp;amp; ), чтобы сначала проверить, существует ли settings объект, а затем сравнить HasAccess свойство с false использованием === .

Здесь true будет возвращено, только если Settings существует и для HasAccess свойства установлено значение false.

 const result = {
  data: [
    { Settings: { HasAccess: true  }, a: 1 },
    { Settings: { HasAccess: false }, a: 2 },
    { Settings: {                  }, a: 3 },
    {                                 a: 4 }
  ]
};

const users = result.data.filter(item => {
  return item.Settings amp;amp; item.Settings.HasAccess === false;
})

console.log(users);  

Если вы хотите получить все результаты, для которых HasAccess не определено или является ложным, используйте вместо or ( || ) оператор not ( ! ).

Здесь будет возвращено значение true, если:

  • Settings не существует
  • HasAccess свойство не определено
  • HasAccess существует, но его значение неверно (null, undefined, false)

 const result = {
  data: [
    { Settings: { HasAccess: true  }, a: 1 },
    { Settings: { HasAccess: false }, a: 2 },
    { Settings: {                  }, a: 3 },
    {                                 a: 4 }
  ]
};

const users = result.data.filter(item => {
  return !item.Settings || !item.Settings.HasAccess;
})

console.log(users);  

Ответ №2:

Я хочу отфильтровать массив и получить только те значения, для которых значение HasAccess равно false, иногда значение Settings равно null

Просто проверьте наличие Settings amp;amp; (HasAccess === false)

 let arr = [{ClientCodeRegional:["29000-A","122214"],CreatedUpdatedBy:null,Email:"testuserthree@for.deletion",Id:"11ad1dfb-3cd6-4db6-87a9-8063bb12504d",Settings:{CsmPassword:"",CsmUser:"",HasAccess:false,IsAdmin:true,IsInternal:false,IsLocked:true,MarketAreaCode:"",Role:"Administrator",Updated:null,UpdatedBy:null,UserId:"11ad1dfb-3cd6-4db6-87a9-8063bb12504d",}},{ClientCodeRegional:["29000-A","122214"],CreatedUpdatedBy:null,Email:"testuserthree@for.deletion",Id:"11ad1dfb-3cd6-4db6-87a9-8063bb12504d",Settings:{CsmPassword:"",CsmUser:"",HasAccess:null,IsAdmin:true,IsInternal:false,IsLocked:true,MarketAreaCode:"",Role:"Administrator",Updated:null,UpdatedBy:null,UserId:"11ad1dfb-3cd6-4db6-87a9-8063bb12504d"}},{ClientCodeRegional:["29000-A","122214"],CreatedUpdatedBy:null,Email:"testuserthree@for.deletion",Id:"11ad1dfb-3cd6-4db6-87a9-8063bb12504d",Settings:{CsmPassword:"",CsmUser:"",//HasAccess:null,
IsAdmin:true,IsInternal:false,IsLocked:true,MarketAreaCode:"",Role:"Administrator",Updated:null,UpdatedBy:null,UserId:"11ad1dfb-3cd6-4db6-87a9-8063bb12504d"}}]

let op = arr.filter(({Settings})=> Settings amp;amp; (Settings.HasAccess === false))
console.log(op)  

Ответ №3:

Вы можете попробовать что-то вроде:

 if (number amp;amp; number.Settings) {
  return number;
} else {
  return true;
}
  

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

1. number.Settings !== 'null' проверяет, является ли это строкой 'null' , а не значением null .

2. Отдельно, если вы выполняете проверку на достоверность с number.Settings последующим amp;amp; , вы знаете , что это ни null ни undefined , поскольку они оба ложные.