在Javascript对象中查找属性的交集
Finding the intersection of properties in Javascript objects
大家好,假设我有以下两个对象
var obj1 = {one:232,two:3123,three:3232}
var obj2 = {one:323,three:3444,seven:32}
我正在尝试编写一个函数,该函数将返回两个对象中的属性,假设我将始终有两个对象作为参数。因此,对于我的输出来说,看到["one","three"]
会非常棒。
这是我写的
var extend = function(obj){
var x = Object.keys(arguments[0]);
var y = Object.keys(arguments[1]);
var inter =[];
for(var i = 0; i < x.length; i++){
for(var k = 0; k < y.length;i++){
if(x[i] === y[k]) {
inter.push(y[k]);
}
}
}
return inter;
}
我期望这样做的是创建一个包含这两个对象属性的数组,并检查每一对对象的属性是否相等。如果是,我希望它将常见项推送到一个新的数组中。出于某种原因,它没有运行,因为它似乎是无限期运行的。
有人能帮忙吗?
让自己轻松一点-
Object.keys返回一个数组,可以使用数组过滤器。
var commonproperties= function(o1, o2){
return Object.keys(o1).filter(function(itm){
return itm in o2
});
}
var obj1 = {one:232,two:3123,three:3232},
obj2 = {one:323,three:3444,seven:32};
commonproperties(obj1 ,obj2);
/* returned value: (Array)
['one','three']
*/
从开始
intersection(Object.keys(o1), Object.keys(o2))
现在您只需要编写intersection
,或者找到一个有它的库(看看下划线)。
重点是交集是集合或列表上的常规操作。与其编写与对象及其键的概念密不可分的交集逻辑,不如找到或编写一个执行一般交集操作的方法,然后简单地将两个键列表提供给它。通过这种方式,您还可以更容易地将特性添加到交集逻辑中——例如,查找两个以上数组的交集。
不过,为什么要麻烦呢?好吧,一个很好的原因是,这种代码不太容易出现你在试图编写一堆循环时遇到的那种错误。
如果你想写自己的intersection
,你可以做得比@kennebec:的filter
方法更糟糕
function intersection(a1, a2) {
return a1.filter(function(elt) { return a2.indexOf(elt) !== -1; });
}
以这种方式分解交集逻辑的另一个优点是,您可以概括数组中"包含"的东西的规则。我们将把标准函数作为第三个参数:
function intersection(a1, a2, contains) {
return a1.filter(function(elt) { return contains(a2, elt); });
}
例如,我可以使用它来不敏感地检查关键交叉点的情况:
intersection(Object.keys(o1), Object.keys(o2), contains_case_insensitive);
我们可以为contains
参数添加一个默认值来处理通常的情况:
function intersection(a1, a2, contains) {
contains = contains || function(a, e) { return a.indexOf(e) !== -1; };
return a1.filter(function(elt) { return contains(a2, elt); });
}
在带有胖箭头功能的ES6中写这篇文章有点紧凑:
function intersection(a1, a2, contains) {
contains = contains || (a, e) => a.indexOf(e) !== -1;
var _contains = elt => contains(a2, elt);
return a1.filter(_contains);
}
我自己做了,因为我找不到我需要的。单线交叉
x={x:1, y:2, z:1};
y={x:3, z:4, r:5};
intersect = Object.keys(x).filter(c => Object.keys(y).indexOf(c) !== -1).reduce((a,b) => {let b1={}; b1[b]=x[b]; return {...a, ...b1}}, {});
console.log(intersect);
相关文章:
- 在JScript 5.8/WSH中具有属性查找的函数名
- 基于分部属性查找HTML
- JavaScript-通过类似的属性查找对象,并将其推送到一个新的数组中
- 如何在javascript中按属性查找数组中的对象
- 按属性查找元素 jQuery
- 在 JavaScript 中按属性查找类实例
- 在对象上定义 getter,以便所有未定义的属性查找都返回 “”
- 余烬未正确初始化存储:无法读取未定义的属性“查找”
- 按数据属性查找和删除项目
- 按属性查找多维对象中的最低数值
- javascript/aunderline:在数组中按属性查找对象,并将它们组合
- 使用JSON中的某个属性查找子对象
- 使用CSS属性查找元素
- 如何在jQuery中通过属性查找数组中的元素
- 用AngularJS的方式在对象数组中根据对象的属性查找对象
- 量角器:根据属性查找元素
- ES6:通过数组中的一个属性查找对象
- 如何使用jQuery通过数据属性查找动态添加的元素
- 按动态属性查找
- jquery通过src属性查找元素