javascript - 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), {} );
如何治愈这个困难?任何提示都会很棒,
谢谢
解决方案
这是因为在方法 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
)对数组执行相同的操作。
推荐阅读
- asp.net - 间歇性 IndexOutOfRangeException 提示缺少 SQL 列,但已通过 IIS 回收解决
- jquery - 为什么我的用户输入字段在提交后不会重置?
- c++ - IntelMPI 错误(适用于 openMPI)
- python - 为 py-elasticsearch-dsl 中的索引创建自定义分析器过滤器
- python - 在 Python 中,在线程之间共享类实例数据和方法,但只有一个特定变量
- openssl - 将 DER 编码的 RSA 公钥与 OpenSSL 一起使用
- php - php中的日期时间差
- phpfox - phpfox:如何获取我的组名?
- javascript - 如何在js中查找特定行调用的网站
- arrays - Excel,在数组的公式文本中计数