当前位置:  开发笔记 > 编程语言 > 正文

es6过滤器数组基于另一个没有变异的数组

如何解决《es6过滤器数组基于另一个没有变异的数组》经验,为你挑选了1个好方法。

过滤阵列已经在这里被问了很多,但我发现的问题和答案都没有考虑到我需要的两个条件:
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.assigndocPosition第二个位置的匹配一起,你将得到所需的结果:

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在回调内部引用它.



1> trincot..:

你可以通过使用find脏位置来做到这一点,这些位置要么返回,要么undefined是脏对象.如果你把它作为第三个参数Object.assigndocPosition第二个位置的匹配一起,你将得到所需的结果:

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; }
推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有