JavaScript:从对象中删除空键

3
const obj = {
  a: '123',
  b: '124',
  c: '1242414',
  d: '',
  e: '',
  f: ''
}

如何从一个对象中删除空值的键?

以下是我尝试过的方法,但无法完成它...

Object.entries(obj).filter(item => item !== "");

你想要一个新的物体还是保留原来的物体? - Nina Scholz
我对这两种情况都无所谓。谢谢! - lecham
5个回答

4

你使用filter时,返回的是一个Array而不是一个Object
使用reduce会更好,因为它可以返回你想要的任何类型。


ES2015

const obj = {
  a: '123',
  b: '124',
  c: '1242414',
  d: '',
  e: '',
  f: ''
}

// creates a new object, without empty keys
console.log(
  Object.entries(obj).reduce((acc, [k, v]) => v ? {...acc, [k]:v} : acc , {})
)

// or mutate the original object
console.log(
  Object.keys(obj).reduce((acc, k) => (!obj[k] && delete acc[k],  acc), obj),
  obj // print original to prove it was mutated
)

或者是另一种简单的变异:

Object.keys(obj).forEach(k => !obj[k] && delete obj[k])

经典的JavaScript:(最有效)

const obj = {
  a: '123',
  b: '124',
  c: '1242414',
  d: '',
  e: '',
  f: ''
}

for(let k in obj)
  if( obj[k] == '' )
    delete obj[k]

console.log(obj)

如果您想缩短它,您可以将其编写为单行代码 :p

for(let k in obj) obj[k] == '' && delete obj[k]

如果你知道键永远不会有0作为值,那么可以这样做:

永远不会有 0 作为值,您可以执行以下操作:

for(let k in obj) !obj[k] && delete obj[k]

使用 for..in 会抛出 eslint 错误 - for..in 循环遍历整个原型链,这几乎永远不是你想要的... - Nikhil Nanjappa
你的评论非常针对于你项目的ESLINT配置。我认为这是一个错误的规则,而且写下这句话“这几乎从来不是你想要的”是错误的,从我的丰富、长期的JavaScript经验来看。 - vsync

0

从一个对象中删除所有的空值Null值

const obj = {
  name: {
    first: "Max",
    middle: "",
    last: "Holder"
  },
  age: 45,
  address: null
}
function removeEmptyOrNull(obj){
    return Object.fromEntries(
     Object.entries(obj)
     .filter(([_, v])=> v!== null && v.length !== 0)
     .map(([k, v])=>[k, v === Object(v)?removeEmptyOrNull(v):v])
   )
}

  console.log(removeEmptyOrNull(obj))

0
在你的回调函数中,item 是一个包含键和值的数组。因此,返回数组中第二个元素是否不是'',并将其转换为对象使用`Object.fromEntries:`

const obj = {
  a: '123',
  b: '124',
  c: '1242414',
  d: '',
  e: '',
  f: ''
};
console.log(
  Object.fromEntries(
    Object.entries(obj)
      .filter(item => item[1] !== "")
  )
);


0

这是一个使用forEach的例子。我认为在删除对象元素时使用delete是最明智的方法:

const obj = {
  a: '123',
  b: '124',
  c: '1242414',
  d: '',
  e: '',
  f: ''
};

Object.keys(obj).forEach(key => {
  if(!obj[key])
    delete obj[key]
});

console.log(obj)


0
下面的代码逐步说明了如何实现这一点。
const obj = {
  a: '123',
  b: '124',
  c: '1242414',
  d: '',
  e: '',
  f: ''
}

const o = Object.entries(obj);
console.log(o);

const f = o.filter(keyValues=>{
 return  keyValues[1]!==""
});

console.log(f);

const filtered = Object.fromEntries(f);

console.log(filtered)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接