Javascript对象-过滤时,我对象的键成为有序数字的列表

时间:2018-08-19 23:00:17

标签: javascript ecmascript-6

我正在过滤一个对象。过滤效果很好,但是我对象的键在键的有序列表中已变形。

这是我的原始对象:

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), {} );

如何解决这个困难?任何提示都会很棒,

谢谢

2 个答案:

答案 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;