我正在过滤一个对象。过滤效果很好,但是我对象的键在键的有序列表中已变形。
这是我的原始对象:
5b7973bdce3eb938a6de86a3
:
{addAt: 1534719398189, quantity: 1}
5b7973bdce3eb938a6de86a5
:
{addAt: 1534719405264, quantity: 1}
5b7973bdce3eb938a6de86a6
:
{addAt: 1534719412309, quantity: 1}
5b7973bdce3eb938a6de86a7
:
{addAt: 1534719410266, quantity: 1}
过滤后(减去一个对象),我的对象如下转换:
0
:
"5b7973bdce3eb938a6de86a3"
1
:
"5b7973bdce3eb938a6de86a7"
2
:
"5b7973bdce3eb938a6de86a6"
为什么我的属性键会更改?
这是迄今为止我没有尝试过的尝试:
方法A ES6:
var newState = Object.keys(state).filter((key, index) => {
console.log("REMOVE_ARTICLE_REDUCER: " + "key: ", key + ", id: ", id);
return key !== id
});
带有破折号的方法B:
newState= _.map(newState, function(object) {
if (object.id !== id) return object;
});
方法C ES6:
Object.filter = (obj, predicate) =>
Object.keys(obj)
.filter( key => predicate(obj[key]) )
.reduce( (res, key) => (res[key] = obj[key], res), {} );
如何解决这个困难?任何提示都会很棒,
谢谢
答案 0 :(得分:1)
这是因为在 方法A 中,您正在过滤键数组而不是对象本身,所以必须将过滤后的键改回对象过滤完之后。
在 方法B 中,您正在映射键,而不是对其进行过滤,因此不需要的键将保留为带有undefined
值的结果对象。
在 方法C 中,您实际上没有犯与方法A中相同的错误(实际上是将键改回了对象),但是过滤了将不起作用,因为您将值传递给谓词而不是键。另外,您正在更改本机对象Object
,这很不好。
这是方法:
ES6:
使用filter
过滤出键,然后使用reduce
将其转换回对象:
var newState = Object.keys(state).filter(key => key != id)
.reduce((obj, key) => (obj[key] = state[key], obj), {});
首先,我们先过滤要保留的对象的键,方法是Object.keys(state)
检索键,而.filter(key => key != id)
仅过滤需要的键。现在,我们剩下了想要的键数组,但是我们希望结果是一个对象,因此我们可以通过简单地创建一个新对象(借助{{1 }}),新对象将为每个需要的键从原始对象reduce
中获取值。
Lodash:
使用_.pickBy
:
state
var newState = _.pickBy(state, (value, key) => key != id);
对对象的作用与_.pickBy
(或_.filter
)对数组的作用相同。
答案 1 :(得分:0)
看起来您只在返回键,而不是对象本身。 试试这个:
const bookSchema = mongoose.Schema({
title: {
type : String,
required : [true, 'Book name required']
},
publisher : {
type : String,
required : [true, 'Publisher name required']
},
thumbnail : {
type : String
}
type : {
type : String
},
hasAward : {
type : Boolean
}
});
//method
bookSchema.methods.findByType = function (callback) {
return this.model('Book').find({ type: this.type }, callback);
};
// statics
bookSchema.statics.findBooksWithAward = function (callback) {
Book.find({ hasAward: true }, callback);
};
const Book = mongoose.model('Book', bookSchema);
export default Book;