Where art thou


写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性-值对都必须存在于 collection 的对象中。

例如,如果第一个参数是 [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }],第二个参数是 { last: "Capulet" },那么你必须从数组(第一个参数)返回其中的第三个对象,因为它包含了作为第二个参数传递的属性-值对。

Global Object

Object.hasOwnProperty()

Object.keys()

思路:
(1)将source的属性名转化为数组;

(2)找出没有这些属性名的对象,从collection数组中剔除出去;

(3)找出与给出属性名的属性值不符的对象,从collection数组中剔除出去;

知识点:

(1)Object.keys()方法会返回一个由一个给定对象的自身可枚举属性组成的数组;

var proArr = Object.keys(source);

(2)Object.hasOwnProperty()方法会返回一个布尔值,指示对象是否具有指定的属性作为自身(不继承)属性;

1  for (var i = 0; i < collection.length; i++) {
2         for (var j = 0; j < proArr.length; j++) {
3           //找出没有这种属性的对象(属性可能有两种以上,只要一个没有就可以排除,所以反向选择是最方便的)
4             if (collection[i].hasOwnProperty(proArr[j]) === false) {
5                 array.push(collection[i]);
6             }
7         }
8     }

(3)Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)

注意这里返回的是属性描述符,所以要获取到值要用.value();

1     for (var k = 0; k <collection.length; k++) {
2         for (var t = 0; t < proArr.length; t++) {
3           //找出与给出对象属性值不符合的对象,和上面一样,反向选择
4             if (Object.getOwnPropertyDescriptor(collection[k], proArr[t]).value !== Object.getOwnPropertyDescriptor(source, proArr[t]).value) {
5                 finArr.push(collection[k]);
6             }
7         }
8     }

(4)Array.filter()方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素,就是过滤元素;

(5)Array.push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

代码:

 1 function where(collection, source) {
 2     var arr = [];
 3     var array = [];
 4     var finArr = [];
 5     var proArr = Object.keys(source);
 6     for (var i = 0; i < collection.length; i++) {
 7         for (var j = 0; j < proArr.length; j++) {
 8             //找出没有这种属性的对象(属性可能有两种以上,只要一个没有就可以排除,所以反向选择是最方便的)
 9             if (collection[i].hasOwnProperty(proArr[j]) === false) {
10                 array.push(collection[i]);
11             }
12         }
13     }
14     collection = collection.filter(function (value) {
15         //通过filter函数在collection数组中将没有这种属性的对象排除
16         if (array.indexOf(value) === -1) {
17             return value;
18         }
19     });
20
21     for (var k = 0; k < collection.length; k++) {
22         for (var t = 0; t < proArr.length; t++) {
23             //找出与给出对象属性值不符合的对象,和上面一样,反向选择
24             if (Object.getOwnPropertyDescriptor(collection[k], proArr[t]).value !== Object.getOwnPropertyDescriptor(source, proArr[t]).value) {
25                 finArr.push(collection[k]);
26             }
27         }
28     }
29     arr = collection.filter(function (value) {
30         //通过filter函数在collection数组中将没有这种属性值的对象排除
31         if (finArr.indexOf(value) === -1) {
32             return value;
33         }
34     });
35     return arr;
36 }

转载于:https://www.cnblogs.com/lailailee/p/7273358.html

FCC 中级算法题 Where art thou相关推荐

  1. FCC 中级算法题 所有素数之和

    Sum All Primes 求小于等于给定数值的质数之和. 只有 1 和它本身两个约数的数叫质数.例如,2 是质数,因为它只能被 1 和 2 整除.1 不是质数,因为它只能被自身整除. 给定的数不一 ...

  2. FCC 中级算法题 罗马数字转换器

    Roman Numeral Converter 将给定的数字转换成罗马数字. 所有返回的 罗马数字 都应该是大写形式. Roman Numerals Array.splice() Array.inde ...

  3. FreeCodeCamp 中级算法(个人向)

    freecodecamp 中级算法地址戳这里 Sum All Numbers in a Range 我们会传递给你一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 1 function ...

  4. 分享两道阿里P7究极难度算法题,满满干货指导

    缘起 深圳市腾讯计算机系统有限公司成立于1998年11月,是中国最大的互联网综合服务提供商之一,也是中国服务用户最多的互联网企业之一. 腾讯业务多元化,覆盖面广:社交.通信.娱乐全面开花.其中,腾讯Q ...

  5. python 数组赋值_LeetCode基础算法题第182篇:一维数组的运行总和

    技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完.目前我选择C语言,Python和Java作为实现语言,因为这三种语 ...

  6. 算法题+JVM+自定义View,详细的Android学习指南

    前言 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 学算法真的很痛苦,虽然大数据现在很火,但找到适合自己定位的职业也未尝不是一种合理选择. ...

  7. 递增的整数序列链表的插入_LeetCode基础算法题第178篇:和为零的N个唯一整数

    技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完.目前我选择C语言,Python和Java作为实现语言,因为这三种语 ...

  8. python 二分查找_LeetCode基础算法题第120篇:二分查找算法

    技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完.目前我选择C语言,Python和Java作为实现语言,因 ...

  9. c语言求一个数的位数不用循环_LeetCode基础算法题第181篇:将数字减少为零的步骤数...

    技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完.目前我选择C语言,Python和Java作为实现语言,因为这三种语 ...

最新文章

  1. 零售连锁专卖信息化解决方案简介之二
  2. python哪一版好用-python IDE有哪些?哪个好用?
  3. java中的Cookie是什么_第74节:Java中的Cookie和Session
  4. Pytorch基础(九)——损失函数
  5. 如何建立搜索引擎_如何建立搜寻引擎
  6. 16.看板方法——三类改进机会笔记
  7. 怎样用html制作动态心,利用html+css3制作心的跳动动画
  8. 信息学奥赛一本通 1258:【例9.2】数字金字塔
  9. dataframe根据时间戳timestamp切分成多个dataframe
  10. LeetCode632 最小区间
  11. 手机sstv解码软件_关于二维码扫描使用专业扫描设备和手机二维码扫描软件的区别?...
  12. 计算机无法启动print,本地计算机无法启动print spooler服务,错误1069怎么处理
  13. 一台电脑控制27台手机技术原理分析
  14. 直方图代码matlab,MATLAB直方图均衡化代码(MATLAB histogram equalization code).doc
  15. 客户细分_客户细分初学者指南
  16. 【报告分享】2021母婴行业白皮书-巨量引擎(附下载)
  17. iOS 新特性实现 3DTouch 开发
  18. 2021智能车小白总结
  19. WPS 两个 word 合并
  20. 小说中场景的功能_小说写作 | 如何做好小说中的场景描写?

热门文章

  1. VS2008 vs2010中JQUERY智能提醒
  2. [深度学习]-CNN-ImageNet历年冠军和相关CNN模型
  3. 【深度学习】简单理解Batch Normalization批标准化
  4. java变量传递给asp,我应该如何将多个参数传递给ASP.Net Web API GET?
  5. 程序员都在用的IDEA插件(不断更新)
  6. html怎么显示数学公式,怎么使用html数学公式显示库MathJax - js笔记
  7. linux内存利用率多少合适,如何理解linux服务器中的内存使用率和平均负载
  8. qt给qdialog加一个滚动条_这些小程序技巧,你敢说你一个用不到?
  9. vux页面转换html,vue vux 怎么用 样式变量 修改主题配色
  10. 用c语言编程计算10,计算方法c语言编程.doc