FCC 中级算法题 Where art thou
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相关推荐
- FCC 中级算法题 所有素数之和
Sum All Primes 求小于等于给定数值的质数之和. 只有 1 和它本身两个约数的数叫质数.例如,2 是质数,因为它只能被 1 和 2 整除.1 不是质数,因为它只能被自身整除. 给定的数不一 ...
- FCC 中级算法题 罗马数字转换器
Roman Numeral Converter 将给定的数字转换成罗马数字. 所有返回的 罗马数字 都应该是大写形式. Roman Numerals Array.splice() Array.inde ...
- FreeCodeCamp 中级算法(个人向)
freecodecamp 中级算法地址戳这里 Sum All Numbers in a Range 我们会传递给你一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 1 function ...
- 分享两道阿里P7究极难度算法题,满满干货指导
缘起 深圳市腾讯计算机系统有限公司成立于1998年11月,是中国最大的互联网综合服务提供商之一,也是中国服务用户最多的互联网企业之一. 腾讯业务多元化,覆盖面广:社交.通信.娱乐全面开花.其中,腾讯Q ...
- python 数组赋值_LeetCode基础算法题第182篇:一维数组的运行总和
技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完.目前我选择C语言,Python和Java作为实现语言,因为这三种语 ...
- 算法题+JVM+自定义View,详细的Android学习指南
前言 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 学算法真的很痛苦,虽然大数据现在很火,但找到适合自己定位的职业也未尝不是一种合理选择. ...
- 递增的整数序列链表的插入_LeetCode基础算法题第178篇:和为零的N个唯一整数
技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完.目前我选择C语言,Python和Java作为实现语言,因为这三种语 ...
- python 二分查找_LeetCode基础算法题第120篇:二分查找算法
技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完.目前我选择C语言,Python和Java作为实现语言,因 ...
- c语言求一个数的位数不用循环_LeetCode基础算法题第181篇:将数字减少为零的步骤数...
技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完.目前我选择C语言,Python和Java作为实现语言,因为这三种语 ...
最新文章
- 零售连锁专卖信息化解决方案简介之二
- python哪一版好用-python IDE有哪些?哪个好用?
- java中的Cookie是什么_第74节:Java中的Cookie和Session
- Pytorch基础(九)——损失函数
- 如何建立搜索引擎_如何建立搜寻引擎
- 16.看板方法——三类改进机会笔记
- 怎样用html制作动态心,利用html+css3制作心的跳动动画
- 信息学奥赛一本通 1258:【例9.2】数字金字塔
- dataframe根据时间戳timestamp切分成多个dataframe
- LeetCode632 最小区间
- 手机sstv解码软件_关于二维码扫描使用专业扫描设备和手机二维码扫描软件的区别?...
- 计算机无法启动print,本地计算机无法启动print spooler服务,错误1069怎么处理
- 一台电脑控制27台手机技术原理分析
- 直方图代码matlab,MATLAB直方图均衡化代码(MATLAB histogram equalization code).doc
- 客户细分_客户细分初学者指南
- 【报告分享】2021母婴行业白皮书-巨量引擎(附下载)
- iOS 新特性实现 3DTouch 开发
- 2021智能车小白总结
- WPS 两个 word 合并
- 小说中场景的功能_小说写作 | 如何做好小说中的场景描写?
热门文章
- VS2008 vs2010中JQUERY智能提醒
- [深度学习]-CNN-ImageNet历年冠军和相关CNN模型
- 【深度学习】简单理解Batch Normalization批标准化
- java变量传递给asp,我应该如何将多个参数传递给ASP.Net Web API GET?
- 程序员都在用的IDEA插件(不断更新)
- html怎么显示数学公式,怎么使用html数学公式显示库MathJax - js笔记
- linux内存利用率多少合适,如何理解linux服务器中的内存使用率和平均负载
- qt给qdialog加一个滚动条_这些小程序技巧,你敢说你一个用不到?
- vux页面转换html,vue vux 怎么用 样式变量 修改主题配色
- 用c语言编程计算10,计算方法c语言编程.doc