Javascript 如何获取值不等于null的对象的键和值?

Javascript 如何获取值不等于null的对象的键和值?,javascript,reactjs,object,Javascript,Reactjs,Object,我有一个像这样的对象: let data = { toDate: this.state.toDate, fromDate: this.state.fromDate, filteredEntityText: null, options: "negative", searchTerm: null }; let newData = { toDate: this.state.toDate, fromDate: this

我有一个像这样的对象:

let data = {
      toDate: this.state.toDate,
      fromDate: this.state.fromDate,
      filteredEntityText: null,
      options: "negative",
      searchTerm: null
    };
let newData = {
    toDate: this.state.toDate,
    fromDate: this.state.fromDate,
    options: "negative"
};
从上面的对象中,我想生成一个新对象,该对象只包含值不为null的键值对

预期结果应如下所示:

let data = {
      toDate: this.state.toDate,
      fromDate: this.state.fromDate,
      filteredEntityText: null,
      options: "negative",
      searchTerm: null
    };
let newData = {
    toDate: this.state.toDate,
    fromDate: this.state.fromDate,
    options: "negative"
};
这里我使用了
数据
对象的一个静态示例,空值稍后可能会有所不同。基本上,我想要一个新对象,其键值对的值不是
null

有人能帮我解决问题吗?

您可以使用
for…in
循环

let数据={
toDate:“toDate”,
fromDate:“fromDate”,
FiltereIdentityText:null,
选项:“否定”,
搜索项:空
};
设newData={};
for(数据中的var k){
如果(数据[k]!=null)
newData[k]=数据[k];
}
console.log(newData)试试这个

let data = {
      toDate: this.state.toDate,
      fromDate: this.state.fromDate,
      filteredEntityText: null,
      options: "negative",
      searchTerm: null
    };

  let giveOriginal = (data){
     let originalHolder = {}
     for(let key in data){
        if(data[key]){
           originalHolder[key] = data[key]
         }
      }
    return originalHolder;
  }

 //call giveOriginal 
 giveOriginal(data)

您可以使用以实现预期结果:

let数据={
托德:“abc”,
起始日期:“cde”,
FiltereIdentityText:null,
选项:“否定”,
搜索项:空
};
var newObj=Object.keys(数据).reduce((acc,el)=>{
//删除value=null的所有键值对
如果(数据[el]!==null)
acc[el]=数据[el];
返回acc;
}, {})
console.log('newObj',newObj)您可以尝试筛选

const数据={
toDate:{},
起始日期:{},
FiltereIdentityText:null,
选项:“负”,
搜索项:空
};
const newData={};
对象。条目(数据)
.filter(([,value])=>value!==null)
.forEach(([key,value])=>(newData[key]=value));

console.log(newData)所有这些都将帮助您删除嵌套的空项。 使用一些ES6/ES2015: 下面的一些示例将直接修改数据对象,或者如果您想创建具有删除的空值的重复对象,可以调用下面给出的函数,它将返回新对象

如果不想创建额外函数并删除“inline”项

Object.keys(data).forEach(k => (!data[k] && data[k] !== undefined) && delete data[k]);
相同,作为函数编写

const removeEmpty = (data) => {
  Object.keys(data).forEach((k) => (!data[k] && data[k] !== undefined) && delete 
       data[k]);
  return data;
};
此函数还使用递归从嵌套对象中删除项:

const removeEmpty = (data) => {
  Object.keys(data).forEach(k =>
    (data[k] && typeof data[k] === 'object') && removeEmpty(data[k]) ||
    (!data[k] && data[k] !== undefined) && delete data[k]
  );
  return data;
};
与之前的功能相同,但与ES7/2016对象相同。条目:

const removeEmpty = data => {
  Object.keys(data).forEach(
    k => !data[k] && data[k] !== undefined && delete data[k]
  );
  return data;
};
与第三个示例相同,但在普通ES5中:

function removeEmpty(data) {
  Object.keys(data).forEach(function(key) {
    (data[key] && typeof data[key] === 'object') && removeEmpty(data[key]) ||
    (data[key] === '' || data[key] === null) && delete data[key]
  });
  return data;
};

首先使用
forEach
在对象数组中迭代
,然后检查
data.searchTerm!==空

这是一个有效的解决方案

类应用程序扩展了React.Component{
状态={
toDate:新日期(),
fromDate:新日期()
};
搜索=[
{
toDate:this.state.toDate,
fromDate:this.state.fromDate,
FiltereIdentityText:null,
选项:“否定”,
搜索项:空
},
{
toDate:this.state.toDate,
fromDate:this.state.fromDate,
FiltereIdentityText:null,
选项:“否定”,
搜索词:“微软”
},
{
toDate:this.state.toDate,
fromDate:this.state.fromDate,
FiltereIdentityText:null,
选项:“否定”,
搜索词:“苹果”
}
];
render(){
让结果=[];
this.searches.forEach(数据=>{
if(data.searchTerm!==null)results.push(数据);
});
控制台日志(结果);
返回(
{results.map((数据,索引)=>(
{data.searchTerm},
))}
);
}
}
const rootElement=document.getElementById(“根”);
render(,rootElement)


使用
Object.keys(data)
获取
数据
的密钥数组。请分享您尝试过的内容,并解释哪些不起作用,我们可以帮助调试它。那么,难道不是免费的代码编写吗service@RobinZigmond我尝试了
Object.values(data.filter)(item=>item!==null)这是一个错误,但结果不是预期的,因为我只得到值。@BirajGautam您尝试了哪个函数?因为我的答案将在将来帮助您删除嵌套的空值。例如,data={a:{b:null}},因此它也将删除null。在我的回答中,如果不想删除空字符串,可以从if中删除该条件。在这里使用reducer函数是没有意义的,就像Mayank的回答一样。它将消耗更多的内存,不要考虑临时解决方案,要考虑时间复杂性、空间复杂性。这是我的首选方法,但我不喜欢简单的
if(data[k])
,因为这将排除OP可能需要的具有
0
'
等值的属性。他们只提到删除
null
,所以我认为
如果(数据[k]!==null)
更合适。@RobinZigmond,你是对的,更新了答案,谢谢:)我在这里做了相同的评论,我在另一个答案上做了相同的评论:这将删除所有具有“falsy”值的属性,这不是OP要求的-他们可能希望保留例如
0
或空字符串值。(在个人层面上,我更喜欢在这里使用循环,而不是
reduce
。尽管总体上我喜欢函数式编程风格。我只是觉得循环更明确。但这是个人偏好的问题。)它不会删除嵌套元素,如数据:{a:'Hi',b:null,c:'',d:{e:'Hello',f:null,g:'}所以输出应该是:data:{a:'Hi',d:{e:'Hello'}}我试过这个:
Object.keys(data).forEach(k=>(!data[k]&&data[k]!==未定义)&&delete data[k])它给了我
未定义的
。正如您所提到的,您的解决方案也适用于嵌套值,将来需要时我一定会使用它们。@BirajGautam,您的对象数据现在已更新。执行此代码后打印数据对象。@BirajGautam,这一行将帮助您直接使用数据对象,而无需初始化新的无用对象。哦,我之前没有完全理解这一点,很抱歉造成混淆,您的解决方案非常有效。@BirajGautam和此语法是ES6,是一种更好的语法。因此,与其使用普通for循环,不如尝试使用forEach和所有这些东西。这肯定会对你的漫画有帮助