首页 > 解决方案 > Javascript 对象 - 过滤时,我的对象的键成为有序数字列表

问题描述

我正在过滤一个对象。过滤效果很好,但我的对象的键被转换为有序的键列表。

这是我的原始对象:

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

带有lodash的方法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), {} );

如何治愈这个困难?任何提示都会很棒,

谢谢

标签: javascriptecmascript-6

解决方案


这是因为在方法 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)仅过滤掉我们需要的键。现在,我们得到了一个我们想要的键数组,但我们希望结果是一个对象,所以我们通过简单地创建一个新对象(在 的帮助下reduce)将该想要的键数组转换为一个对象,新对象将为state每个想要的键从原始对象中获取值。

罗达什:

使用_.pickBy

var newState = _.pickBy(state, (value, key) => key != id);

_.pickBy对对象执行与_.filter(或Array#filter)对数组执行相同的操作。


推荐阅读