gpt4 book ai didi

javascript - 如何找到 JavaScript 对象之间的公共(public)属性

转载 作者:搜寻专家 更新时间:2023-10-31 23:21:46 26 4
gpt4 key购买 nike

查找对象数组的共同/不同属性的最佳/最有效方法是什么。

我需要确定存在于所有对象中并且都具有相同值(公共(public)值)的属性集。最好我还想获得一个具有所有其他属性(差异)的数组。

我一直在寻找可以做到这一点的高效库/函数。但是没有找到任何东西。所以我自己尝试了。

考虑这个 JS 对象数组:

var objects = [{
id: '2j2w4f',
color: 'red',
height: 20,
width: 40,
owner: 'bob'
}, {
id: '2j2w3f',
color: 'red',
height: 20,
width: 41,
owner: 'bob'
}, {
id: '2j2w2f',
color: 'red',
height: 21,
}, {
id: '2j2w1f',
color: 'red',
height: 21,
width: 44
}];

我想将color(值为red)标识为唯一的公共(public)属性。请注意,它们没有相同的属性集。例如。 owner 不是公共(public)属性(property)。

这是我自己尝试解决的(使用lodash):

function commonDifferentProperties(objects) {
// initialize common as first object, and then remove non-common properties.
var common = objects[0];
var different = [];
var i, obj;

// iterate through the rest (note: i === 0 is not supposed to be covered by this)
for (i = objects.length - 1; i > 0; i--) {
obj = objects[i];
// compare each property of obj with current common
_.forOwn(obj, function (value, key) {
// if property not in current common it must be different
if (_.isUndefined(common[key])) {
if (!_.contains(different, key)) {
different.push(key);
}
} else if (common[key] !== value) { // remove property from common if value is not the same
delete common[key];
different.push(key);
}
});

// check that all properties of common is present in obj, if not, remove from common.
_.forOwn(common, function (value, key) {
if (_.isUndefined(obj[key])) {
delete common[key];
different.push(key);
}
});

}

return {
common: common,
different: different
};
}

jsFiddle with the example

我也尝试过 mapReduce 方法,但那似乎更糟。

我仍然认为这似乎有点复杂/耗时,我将对 1000-10000 个对象或更多对象执行此操作,每个对象具有 20-50 个属性。

有什么建议吗?

最佳答案

您的解决方案中有两处看起来不对:

  • 通过 var common = objects[0]; 你没有复制对象,所以你会破坏 objects
  • 你们都检查 obj 中是否存在 common 的所有属性,而且将 obj 的每个属性与当前 common 进行比较。这似乎太多了。 一开始没有意识到您还需要 different 属性。

我会分两次遍历数据。第一种,您收集一个对象中所有明显的属性,第二种,您测试它们是否常见:

function commonDifferentProperties(objects) {
var common = _.reduce(objects, function(acc, obj) {
for (var p in obj)
acc[p] = obj[p];
return acc;
}, {});
var different = _.reduce(objects, function(acc, obj) {
for (var p in common)
if (common[p] !== obj[p]) {
delete common[p];
acc.push(p);
}
return acc;
}, []);
return {
common: common,
different: different
};
}

关于javascript - 如何找到 JavaScript 对象之间的公共(public)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23199349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com