首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按键和值筛选对象

按键和值筛选对象
EN

Stack Overflow用户
提问于 2021-10-11 22:27:34
回答 3查看 120关注 0票数 0

是否有条件地筛选对象,同时检查键和值?我要做的是检查键是否等于字符串,并检查值是否为空。

我想知道教学医院是否有空洞的价值,但教学医院的税务证明却没有,反之亦然。如果教学医院名称有一个值,但教学医院税务ID没有,返回的结果应该是:{教学医院税ID:""}。

对象

代码语言:javascript
复制
{
  'Manufacturer Name': 'Ascendis',
  'HCP First Name': 'John',
  'HCP Middle Name': '',
  'HCP Last Name': '',
  'HCP NPI': 2442,
  'HCP Credentials': '',
  'HCP State License Number': '',
  'HCP State of Licensure': '',
  'HCP Specialty': '',
  'Teaching Hospital Name': 'Trinity',
  'Teaching Hospital Tax ID': '',
  'Address 1': '',
  'Address 2': '',
  'Postal Code': '',
  'Spend Date': '',
  'Spend Currency': '',
  'Spend Amount': '',
  'Form of Payment': '',
  'Nature of Payment': '',
  'Home System Identifier': '',
  'Product Name': '',
  'Travel City': '',
  'Travel State': '',
  'Travel Country': ''
}

代码语言:javascript
复制
Object.entries(item)
          .filter(([key, value]) => (key === "Teaching Hospital Name" && value != "") && (key === "Teaching Hospital Tax ID" && value === ""))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-11 22:39:16

让我们分析一下我们得到了什么和我们想要什么。

  • 我们有一个模型obj
  • 我们希望选择特定的键,并根据选中的键/值运行特定的检查。
  • 检查返回那些键值为空字符串的对象。
  • 此外,如果所有值都为空,则检查将忽略结果。

我们可以把上面写成

代码语言:javascript
复制
1. if(allValues has an empty string) return false // ignore results
2. if(allValues has NOT an empty string) return false // ignore 3. results
3. return object with those keys where value is empty string

在JS中看起来就像

代码语言:javascript
复制
// your model
const obj = {}
// your group of keys you want to pick from object
const group = [];
// picked [[key,value]] defined by your group
const entries = Object.entries(obj).filter(([key]) => group.includes(key));
// filter out those which are empty
const emptyEntries = entries.filter(([key, value]) => value === ""); 
// 1. step - to check if all values are empty we can check lengths
if(entries.length === emptyEntries.length) return false;
// 2. step - just check if filtered length is 0
if(emptyEntries.length === 0) return false
// 3. step - convert your emptyEntries to object
return Object.fromEntries(emptyEntries);

让我们看看下面的代码是否适合您

代码语言:javascript
复制
const obj = {
  'Manufacturer Name': 'Ascendis',
  'HCP First Name': 'John',
  'HCP Middle Name': '',
  'HCP Last Name': '',
  'HCP NPI': 2442,
  'HCP Credentials': '',
  'HCP State License Number': '',
  'HCP State of Licensure': '',
  'HCP Specialty': '',
  'Teaching Hospital Name': 'Trinity',
  'Teaching Hospital Tax ID': '',
  'Address 1': '',
  'Address 2': '',
  'Postal Code': '',
  'Spend Date': '',
  'Spend Currency': '',
  'Spend Amount': '',
  'Form of Payment': '',
  'Nature of Payment': '',
  'Home System Identifier': '',
  'Product Name': '',
  'Travel City': '',
  'Travel State': 'nonempty',
  'Travel Country': ''
}
function check(obj, groupArr) {
  const group = new Set(groupArr);
  const vals = Object.entries(obj).filter(([key, value]) => group.has(key) && value === "");
  if(vals.length === group.size || vals.length === 0) return false;
  return Object.fromEntries(vals);
}
console.log(check(obj, ["Travel City", "Travel State", "Travel Country"]));
/* results
{
   "Travel City": "",
   "Travel Country": ""
}
*/

票数 0
EN

Stack Overflow用户

发布于 2021-10-11 22:36:00

使用||而不是&&

代码语言:javascript
复制
const obj = {
  'Manufacturer Name': 'Ascendis',
  'HCP First Name': 'John',
  'HCP Middle Name': '',
  'HCP Last Name': '',
  'HCP NPI': 2442,
  'HCP Credentials': '',
  'HCP State License Number': '',
  'HCP State of Licensure': '',
  'HCP Specialty': '',
  'Teaching Hospital Name': 'Trinity',
  'Teaching Hospital Tax ID': '',
  'Address 1': '',
  'Address 2': '',
  'Postal Code': '',
  'Spend Date': '',
  'Spend Currency': '',
  'Spend Amount': '',
  'Form of Payment': '',
  'Nature of Payment': '',
  'Home System Identifier': '',
  'Product Name': '',
  'Travel City': '',
  'Travel State': '',
  'Travel Country': ''
}

Object.entries(obj).forEach(([key, value]) => {
    if ((key === "Teaching Hospital Name" && value != "") || (key === "Teaching Hospital Tax ID" && value === "")) {
        delete obj[key]
    }
})

console.log(obj)

票数 0
EN

Stack Overflow用户

发布于 2021-10-11 22:37:55

您可以使用Array.prototype.reduce创建一个新对象,删除选择属性:

代码语言:javascript
复制
Object.entries(obj).reduce((acc, [key, value]) => {
  if (
    (key === "Teaching Hospital Name" && value !== "") ||
    (key === "Teaching Hospital Tax ID" && value === "")
  ) {
    // do not add key/value to resulting object
    return { ...acc };
  }

  return { ...acc, [key]: value };
}, {});

这避免了原始对象的变异。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69533102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档