假设我有一个对象:

{
  item1: { key: 'sdfd', value:'sdfd' },
  item2: { key: 'sdfd', value:'sdfd' },
  item3: { key: 'sdfd', value:'sdfd' }
}

我想通过过滤上面的对象来创建另一个对象这样我就有了。

 {
    item1: { key: 'sdfd', value:'sdfd' },
    item3: { key: 'sdfd', value:'sdfd' }
 }

我正在寻找一种干净的方法来实现这一点使用Es6,所以扩散操作符是可用的。


当前回答

另一种使用数组的解决方案。在允许的键上减少方法:

const raw = {
  item1: { key: 'sdfd', value:'sdfd' },
  item2: { key: 'sdfd', value:'sdfd' },
  item3: { key: 'sdfd', value:'sdfd' }
};

const allowed = ['item1', 'item3'];

const filtered = allowed.reduce((obj, key) => { 
  obj[key] = raw[key]; 
  return obj 
}, {})

console.log(filtered);

特别是对于较大的源对象(在本例中为原始对象),这是有意义的。迭代不会使用源的所有条目执行,而只使用您想要过滤的键,因此更短/更快…

演示在这小提琴…


但我必须说,我也喜欢这个答案中的解决方案使用object。fromentries数组。filter和Array.includes:

const object = object . fromentries ( Object.entries(生)。Filter (([key, value]) => allowed.includes(key)) );

演示在这小提琴…

其他回答

好吧,这样怎么样:

const myData = {
  item1: { key: 'sdfd', value:'sdfd' },
  item2: { key: 'sdfd', value:'sdfd' },
  item3: { key: 'sdfd', value:'sdfd' }
};

function filteredObject(obj, filter) {
  if(!Array.isArray(filter)) {
   filter = [filter.toString()];
  }
  const newObj = {};
  for(i in obj) {
    if(!filter.includes(i)) {
      newObj[i] = obj[i];
    }
  }
  return newObj;
}

像这样叫它:

filteredObject(myData, ['item2']); //{item1: { key: 'sdfd', value:'sdfd' }, item3: { key: 'sdfd', value:'sdfd' }}

下面的方法获取要过滤的对象和任何属性。

函数removeObjectKeys(obj,…keysToRemove) { let mObject ={…obj} for (let key of keysToRemove) { const{[字符串(键)]:_,…rest} = mObject mObject ={…休息} } 返回mObject } Const obj = {123: "hello", 345: "world", 567: "and kitty"}; const filtered = removeObjectKeys(obj, 123); console.log(过滤); const twoFiltered = removeObjectKeys(obj, 345,567); console.log (twoFiltered);

这就是我的解决方案:

const filterObject = (obj, condition) => {
    const filteredObj = {};
    Object.keys(obj).map(key => {
      if (condition(key)) {
        dataFiltered[key] = obj[key];
      }
    });
  return filteredObj;
}

你可以这样做:

const base = {
  item1: { key: 'sdfd', value:'sdfd' },
  item2: { key: 'sdfd', value:'sdfd' },
  item3: { key: 'sdfd', value:'sdfd' }
};

const filtered = (
    source => { 
        with(source){ 
            return {item1, item3} 
        } 
    }
)(base);

// one line
const filtered = (source => { with(source){ return {item1, item3} } })(base);

这是可行的,但不是很清楚,加上with语句不推荐(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with)。

另一种方法是使用Array.prototype.forEach()作为

Const raw = { item1: { 关键:“sdfd”, 价值:“sdfd” }, 第二条:{ 关键:“sdfd”, 价值:“sdfd” }, item3: { 关键:“sdfd”, 价值:“sdfd” } }; Const allowed = ['item1', 'item3', 'll ']; var finalObj = {}; 允许的。forEach(allowedVal => { 如果原始[allowedVal]) finalObj[allowedVal] = raw[allowedVal] }) console.log (finalObj)

它只包含原始数据中可用的那些键的值,从而防止添加任何垃圾数据。