js对象除了指定的几个key保留,清除其它?

{
    "proCostType": "01",
    "payment": "01",
    "amount": 0,
    "invoiceCount": 0,
    "excludeTax": 0,
    "addedTax": 0,
    "passengerAmount": 0,
    "fuelSurchargeAmount": 0,
    "moneyCheck": false,
    "empCode": "",
    "memo": "",
    "branch": "",
    "list": [],
    "taxRate": "6%",
    "pageTitle": "成本录入",
    "serverBranch": "SH",
    "realOprBranchName": "上海",
    "realOprBranch": "SH",
    "inputDate": "2022-08-10",
    "dictProCostType": [
        {
            "code": "01",
            "value": "专项成本"
        },
        {
            "code": "05",
            "value": "专项成本(国内机票)"
        },
        {
            "code": "06",
            "value": "专项成本(国内火车票)"
        },
        {
            "code": "07",
            "value": "专项成本(国内公路水路车票)"
        },
        {
            "code": "08",
            "value": "专项成本(交通费-电子)"
        },
        {
            "code": "02",
            "value": "代付项"
        },
        {
            "code": "03",
            "value": "外部劳务费"
        },
        {
            "code": "04",
            "value": "餐费"
        },
        {
            "code": "09",
            "value": "内部结算"
        },
        {
            "code": "10",
            "value": "物料"
        },
        {
            "code": "12",
            "value": "大萨达所大所"
        },
        {
            "code": "13",
            "value": "成长型创新支撑着"
        }
    ],
    "dictRecCompany": [
        {
            "code": "01",
            "orderby": "01",
            "value": "上海312321"
        },
        {
            "code": "141",
            "orderby": "03",
            "value": "上海412421421"
        },
        {
            "code": "172",
            "orderby": "04",
            "value": "上海421421421421"
        }
    ]
}

数据如上,想要保留dictProCostType和dictRecCompany数组,其它字段清空,应该如何处理

阅读 4.1k
5 个回答
const obj = {
  a: 1,
  b: 2,
  c: [1,2,3],
}

for (const key of Object.keys(obj)) {
  if (key !== 'a' || key !== 'b') {
    // delete obj[key];
    // obj[key] = null;
    obj[key] = '';
  }
}

console.log(obj);

也可以直接返回个新的对象吧

虽然这种问题是回答过的,但是懒得去找了,干脆再回答一次。

已经明确的知道需要取哪些属性,那么可以直接用硬代码来取,解构再组合成对象就可以了

function getWant(source) {
    const { dictProCostType, dictRecCompany } = source;
    return { dictProCostType, dictRecCompany };
}

console.log(getWant(obj));

如果想要取的属性是一个字符串列表(或者做成一个字符串列表),可以拆解对象,筛选再组合成对象的方式:

function getWant(source, props) {
    return Object.fromEntries(
        Object.entries(source)
            .filter(([key]) => props.includes(key))
    );
}

console.log(getWant(obj, ["dictProCostType", "dictRecCompany"]));

不过既然是用的 filter,所以也可以做得更灵活一些,直接通过 filter 函数来选择属性,

function getWant(source, filter) {
    return Object.fromEntries(Object.entries(source).filter(filter));
}

console.log(getWant(obj, ([, value]) => Array.isArray(value)));

上面这个示例筛选了值是数组的属性(会包含那个名为 list 的属性)。

有时候可以换个思路,你可以创建一个新的对象,让它只包含这两个数据

// source 为你上面的对象
const obj = Object.create(null);
obj.dictProCostType = source.dictProCostType;
obj.dictRecCompany = source.dictRecCompany;

如果你是在先删属性,可以这样删

Object.getOwnPropertyNames(obj).forEach(key => {
  if(key !=="dictProCostType" && key !== "dictRecCompany"){
    delete obj[key]
  }
})

了解下 lodash 或 underscore 的 pick 和 omit 方法

var object = { 'a': 1, 'b': '2', 'c': 3 };
 
_.omit(object, ['a', 'c']);
// => { 'b': '2' }

pickomit

当然想自己实现也很容易😅

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题