0

我一直在努力创建一个带有 source 和 keys 参数的 omit 函数,它检查源中的键,如果找到它们,则从源中省略这些属性,然后使用剩余的键创建一个新的对象文字/源中的值对。到目前为止,我一直没有成功,并且只能创建一个与使用源中找到的键创建对象相反的函数。谁能帮我弄清楚我错过了什么?将不胜感激!

function omit(source, keys) {
  var includedSource = {};
  for (var key in source) {
    for (var i = 0; i < keys.length; i++) {
      if (keys[i] !== key) {
        includedSource[key] = source[key];
        console.log('source[keys[i]]:', source[keys[i]]);
        console.log('includedSource:', includedSource);
      }
    }
  }
  return includedSource;
}

  function omit(source, keys) {
    var includedSource = {};
    for (var key in source) {
      for (var i = 0; i < keys.length; i++) {
        if (keys[i] === key) {
          includedSource[key] = source[key];
          console.log('source[keys[i]]:', source[keys[i]]);
          console.log('includedSource:', includedSource);
          }
        }
     }
     return includedSource;
   }
4

5 回答 5

2

这是一个带有平面对象的简单实现。如果您的对象可能是嵌套的,我不确定如何声明键,并且您希望提取一些 N 级嵌套值/键

const obj = {
  A: 1,
  B: 2,
  C: 3,
  D: 4
};

function omit(data, keys) {
  let result = {};

  for (let key in data) {
    if (keys.includes(key)) continue;

    result[key] = data[key];
  }

  return result;
}

console.log(omit(obj, ["A", "D"])) // {B: 2, C: 3}
于 2022-01-15T19:11:34.213 回答
1

您可以解构并为新对象休息。

function omit(object, keys) {
    let _; // prevent to be global
    for (const key of keys) ({ [key]: _, ...object } = object);
    return object;
}

console.log(omit({ a: 1, b: 2, c: 3, d: 4 }, ['b', 'c']));

于 2022-01-15T19:13:00.183 回答
1

一种方法是使用Object.entries()并过滤出具有不需要的键的条目,然后用于Object.fromEntries()从过滤的条目中创建新对象

const omit = (data, keys) => {
  return Object.fromEntries(
    Object.entries(data).filter(([k]) => !keys.includes(k))
  )
}


console.log(omit({ a:1,b:2,c:3,d:4}, ['a', 'b']))

于 2022-01-15T19:17:05.623 回答
1

转换为条目,Object.entries然后Object.fromEntries过滤所述条目<Array>.filter可能会很好地工作:

const omit = (obj, keys) => Object.fromEntries(Object.entries(obj).filter(a=>!keys.includes(a[0])));
于 2022-01-15T19:17:30.037 回答
0

您的解决方案的问题是,即使不等于,keys[i + 1]也可能等于。keykeys[i]

要更正您的代码,请应用以下更改。

function omit(source, keys) {
  var includedSource = {};
  for (var key in source) {
    if(!keys.includes(key)) { // <--- Change this
       includedSource[key] = source[key];
       console.log('source[keys[i]]:', source[keys[i]]);
       console.log('includedSource:', includedSource);
    }
  }
  return includedSource;
}

另一种方法,只是为了好玩。

function omit(source, keys) {
    return Object.keys(source).reduce((acc, curr) => {
        return {...acc, ...(keys.includes(curr) ? {} : {[curr]: source[curr]})}
    }, {})
}
于 2022-01-15T19:23:27.870 回答