过滤阵列已经在这里被问了很多,但我发现的问题和答案都没有考虑到我需要的两个条件:
1.不要改变对象.
2.使用es6(ecmascript2015)及以上.
3.获取一个包含重写对象和值的新数组.
我实际上有一个答案我的问题的一部分,那就是如何过滤但感觉就像一个黑客而不是一个真正的解决方案,第二部分是如何从第二个数组获得完整的原始数组,但没有变异对象.
这是我的代码,因为你可以看到我{dirty:true}
明确地分配了它而不是从它自己的数组中传递对象:
const docPositions = [ { active : false, dirty : false, key : "somekey2" }, { active : false, dirty : false, key : "somekey1" }, { active : false, dirty : false, key : "somekey4" }, { active : false, dirty : false, key : "somekey3" } ] const dirtyPositions = [ { active : false, dirty : true, key : "somekey1" }, { active : false, dirty : true, key : "somekey3" } ] let result = docPositions.filter(x=> dirtyPositions.some(y=>y.key == x.key)) .map(o=> Object.assign({},o,{dirty:true})); console.log(result);
结果:
Array [ Object { "active": false, "dirty": true, "key": "somekey1" }, Object { "active": false, "dirty": true, "key": "somekey3" } ]
期望的结果:
Array [ { active : false, dirty : false, key : "somekey2" }, { active : false, dirty : true, key : "somekey1" }, { active : false, dirty : false, key : "somekey4" }, { active : false, dirty : true, key : "somekey3" } ]
trincot.. 5
你可以通过使用find
脏位置来做到这一点,这些位置要么返回,要么undefined
是脏对象.如果你把它作为第三个参数Object.assign
与docPosition
第二个位置的匹配一起,你将得到所需的结果:
const result = docPositions.map( x => Object.assign({}, x, dirtyPositions.find(y=>y.key == x.key)));
const docPositions = [
{
active : false,
dirty : false,
key : "somekey2"
},
{
active : false,
dirty : false,
key : "somekey1"
},
{
active : false,
dirty : false,
key : "somekey4"
},
{
active : false,
dirty : false,
key : "somekey3"
}
]
const dirtyPositions = [
{
active : false,
dirty : true,
key : "somekey1"
},
{
active : false,
dirty : true,
key : "somekey3"
}
]
const result = docPositions.map(
x => Object.assign({}, x, dirtyPositions.find(y=>y.key == x.key)));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
上面的时间复杂度为O(n²),因此当两个数组都很大时,.find()
每次.map()
迭代执行可能会变得太昂贵.在这种情况下,最好先将dirtyPositions
数组转换为a Map
.为了与函数式编程风格保持一致,您可以将该Map作为上下文传递给.map()
它,以便它可用this
.为此,您需要使用标准function
表示法:
const result = docPositions.map(function (x) { return Object.assign({}, x, this.get(x.key)); }, new Map(dirtyPositions.map(y=>[y.key, y])));
这将在O(n)中运行,因为get()
在大多数实现中操作在时间上接近恒定.
const docPositions = [
{
active : false,
dirty : false,
key : "somekey2"
},
{
active : false,
dirty : false,
key : "somekey1"
},
{
active : false,
dirty : false,
key : "somekey4"
},
{
active : false,
dirty : false,
key : "somekey3"
}
]
const dirtyPositions = [
{
active : false,
dirty : true,
key : "somekey1"
},
{
active : false,
dirty : true,
key : "somekey3"
}
]
const result = docPositions.map(function (x) {
return Object.assign({}, x, this.get(x.key));
}, new Map(dirtyPositions.map(y=>[y.key, y])));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
请注意,Map
构造函数可以采用键/值对(也是数组)的数组.这个新Map作为可选项传递thisArg
,.map()
以便可以this
在回调内部引用它.
你可以通过使用find
脏位置来做到这一点,这些位置要么返回,要么undefined
是脏对象.如果你把它作为第三个参数Object.assign
与docPosition
第二个位置的匹配一起,你将得到所需的结果:
const result = docPositions.map( x => Object.assign({}, x, dirtyPositions.find(y=>y.key == x.key)));
const docPositions = [
{
active : false,
dirty : false,
key : "somekey2"
},
{
active : false,
dirty : false,
key : "somekey1"
},
{
active : false,
dirty : false,
key : "somekey4"
},
{
active : false,
dirty : false,
key : "somekey3"
}
]
const dirtyPositions = [
{
active : false,
dirty : true,
key : "somekey1"
},
{
active : false,
dirty : true,
key : "somekey3"
}
]
const result = docPositions.map(
x => Object.assign({}, x, dirtyPositions.find(y=>y.key == x.key)));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }