我的对象看起来像这样
const obj = Immutable.fromJS({
{
1: {foo: 'a'}, 2: {foo: 'b'}, 3: {foo: 'ac'}, ...
}
});
我要搜索对象,并返回类似的结果
const results = {
1: {foo: 'a'}, 3: {foo: 'ac'}
};
那是我到目前为止所得到的。但是,这仅在object
是Immutable Object
的情况下有效。
const search = 'a';
const results = obj.filter(elem => {
return search.split(' ').some(word => {
return (
elem.get('foo').indexOf(word) > -1
)
});
})
如何过滤obj
是否为Vanilla JavaScript对象?
答案 0 :(得分:1)
我不认为Immutable Object
是普通的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);