大家好,我想我有两个对象
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;
}
我期望这样做是为了创建两个对象属性的数组,并检查每对对象以查看它们是否相等。如果它们是我希望它将常见项目推送到新阵列。出于某种原因,这不会运行,因为它似乎无限期地运行。
有人可以帮忙吗?
答案 0 :(得分:2)
让自己轻松自如 -
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']
*/
答案 1 :(得分:0)
从
开始intersection(Object.keys(o1), Object.keys(o2))
现在你只需要写intersection
,或者找一个有它的库(看下划线)。
关键是交集是对集合或列表的一般操作。不是编写与对象及其键的概念密不可分的交叉逻辑,而是找到或编写执行该一般交叉操作的方法,然后简单地将它提供给两个键列表。这样,您还可以更轻松地向交叉点逻辑添加功能 - 例如,查找两个以上数组的交集。
仍然,为什么要打扰?好吧,有一个很好的理由是这种代码不太容易遇到你遇到的bug类型,试图编写一堆循环。
如果您想编写自己的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);
}
答案 2 :(得分:0)
我自己做的,因为我没有找到我需要的。一条线相交
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);