js请问怎么取出两个对象里面相同的属性

const arr1 =  {
  "id": 1,
  "userName": "超级管理员",
  "loginName": "admin",
  "password": "admin",
  "token": "5774696f61fb49938b325bcf048190d4",
  "headImgUrl": "https://sm-xuanxue-test.oss-cn-guangzhou.aliyuncs.com/comment/14.jpg",
  "phone": "",
  "roleId": 0,
  "roleName": "超级管理员",
  "loginTime": "2022-06-26T02:56:28.000+0000",
  "remark": "",
  "showStatus": 0,
  "parentId": 0,
  "isDel": 0,
  "createTime": "2021-12-07 11:28:43",
  "editTime": "2022-06-26T02:56:28.000+0000",
  "createBy": "test",
  "editBy": "",
  "subjectName": null,
  "subjectHost": null,
  "wxMchId": null,
  "parentName": null,
  "bankCardNo": null,
  "bank": null,
  "bankCardAccount": null,
  "identityNumber": null,
  "useChannelCount": 50,
  "expiredChannelCount": 100,
  "status": "启用",
  "title": "编辑"
}

const arr2 = {
        loginName: '',
        userName: '',
        password: '',
        roleId: '',
        phone: '',
        showStatus: '',
        headImgUrl: '',
      }
阅读 3.7k
2 个回答

媛妹儿,看你也入行这么久了,要不自己试试先?

提示:

  1. Object.keys() 可以拿到所有属性名,Object.entries() 可以拿到所有 Entry,是 [key, value] 的形式。
  2. x in obj 可以检查 x 所引用的字符串是否是 obj 的属性名。
  3. 遍历 arr1 的 entry 可以进行 filter,把所有属性名存在于 arr2 中的 entry 过滤出来
  4. Object.fromEntries() 可以从 entry 列表生成对象
  5. 第 3 步的反向过滤可以拿到不需要的属性名列表,遍历这个列表从 arr1 中删除属性可以直接修改 arr1 使之剩下与 arr2 中相同的属性(删除用 delete 就好)

下面是参考答案,写程序的时候发现,两个命名为 arr# 的,其实是对象……😂

function resolve0(obj, keysObj) {
    const result = {};
    for (let key in keysObj) {
        result[key] = obj[key];
    }
    return result;
}
console.log(resolve0(arr1, arr2));

function resolve1(obj, keysObj) {
    return Object.fromEntries(
        Object.entries(obj)
            .filter(([key]) => key in keysObj)
    );
}
console.log(resolve1(arr1, arr2));

function resolve2(obj, keysObj) {
    return Object.fromEntries(
        Object.keys(keysObj)
            .map(key => [key, obj[key]])
    );
}
console.log(resolve2(arr1, arr2));

function resolve3(obj, keysObj) {
    Object.keys(obj)
        .filter(key => !(key in keysObj))
        .forEach(key => delete obj[key]);
    return obj;
}
console.log(resolve3(arr1, arr2));
// resolve3 直接修改了原对象,所以这时候 arr1 已经不含多余的属性了
console.log(arr1);

不知道你是求交集,还是按照某个对象作为模板,我这里就直接按交集写了。

const intersection = (obj1, obj2) => {
    const res = {};
    for (const [k, v] of Object.entries(obj1)) {
        if (obj2[k] === undefined) continue;
        res[k] = v || obj2[k];
    }
    return res;
}

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