过滤对象的最佳方法

时间:2019-06-19 08:18:24

标签: javascript

我的对象看起来像这样

const obj = Immutable.fromJS({
    {
        1: {foo: 'a'}, 2: {foo: 'b'}, 3: {foo: 'ac'}, ...
    }
 });

我要搜索对象,并返回类似的结果

const results = {
    1: {foo: 'a'}, 3: {foo: 'ac'}
};

那是我到目前为止所得到的。但是,这仅在objectImmutable Object的情况下有效。

const search = 'a';
const results = obj.filter(elem => {
      return search.split(' ').some(word => {
        return (
          elem.get('foo').indexOf(word) > -1 
          )
      });
    })

如何过滤obj是否为Vanilla JavaScript对象?

2 个答案:

答案 0 :(得分:1)

我不认为Immutable Object是普通的javascript类型。您在使用某种第三方库吗?

如何过滤javascript对象

常规javascript对象未定义filter方法。解决此问题的一种方法是先将对象转换为其条目的数组,过滤条目,然后再转换回对象:

const filterObject = ( filterFn, obj ) => {
  const validEntries = Object
    .entries(obj)
    .filter(filterFn);
    
  return Object.fromEntries(validEntries);
};
  
  
console.log(
  filterObject(
    ([ key, value ]) => value !== 2,   
    { "a": 1, "b": 2, "c": 3 }
  )
);

请注意,并非所有浏览器都支持Object.fromEntries

您可能会注意到,我的过滤器函数与传递给Array#filter调用的函数有些不同。 Object.entries返回键值对数组。因此,filterFn应该采用键和值的数组,我在参数中对其进行了分解。

实施您请求的过滤器逻辑

const filterObject = ( filterFn, obj ) => {
  const validEntries = Object
    .entries(obj)
    .filter(filterFn);
    
  return Object.fromEntries(validEntries);
};
  
const search = "a";
const myFilter = ([_, elem]) => { // elem corresponds to our entry's value
  return search
    .split(' ')
    .some(word =>
      elem.foo.indexOf(word) > -1 // Use the regular . syntax instead of .get 
    );
}
  
console.log(
  filterObject(
    myFilter,  
    { 1: {foo: 'a'}, 2: {foo: 'b'}, 3: {foo: 'ac'} }
  )
);

答案 1 :(得分:0)

您可以通过以下方式进行操作:

const keys = [1, 3];

const obj = {1: {test: 1}, 2: {test: 2}, 3: {test: 3}};

let yourObject = Object.keys(obj)
    .filter(key => keys.includes(parseInt(key)))
    .map(key => {
        return {[key]: obj[key]}
    })
    .reduce((a, b) => Object.assign({}, a,b));
console.log(yourObject);