比较具有相似属性的同一集合中的对象数组

时间:2018-03-19 16:34:23

标签: javascript lodash

我试图比较数组中的每个对象。

让我们在下面说出我的阵列:

var objects = [{
        'x': 1,
        'y': 2
    }, {
        'x': 2,
        'y': 1
    },{
        'x': 3,
        'y': 1
    },{
        'x': 4,
        'y': 1
    }];

如果有两个项目,比如item1item2,我需要通过数组检查条件item1.x == item2.yitem1.y == item2.x

Lodash 是否有干净/有效的方法?

3 个答案:

答案 0 :(得分:1)



var objects = [
    {'x': 1, 'y': 2},
    {'x': 2, 'y': 1},
    {'x': 3, 'y': 1},
    {'x': 4, 'y': 1}
];
    
var comparedLodash = _.map(objects, function (item) {
  return !!_.find(objects, {x: item.y, y: item.x}); 
});
console.log(comparedLodash);

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>
&#13;
&#13;
&#13;

复杂性为 O(n ^ 2)

注意:如果在开始比较之前对数组进行了排序,则可以将其设为 O(nlogn),但这会给代码增加很大的噪音。

故障:

_.map(somearray, somefunction) functionsomefunction执行到somearray的每个元素中。我们将使用它将objects数组的每个项转换为布尔值。大致就像是:

var comparedLodash = _.map(objects, functionThatWillConvertAnItemIntoABoolean);

现在,如果有item1 trueanotherItem item1.x == anotherItem.y,则每个item1.y == anotherItem.x都应转换为someobject。要查找此另一项是否存在,我们使用_.find()

如果somearray中存在function (item) { var anotherItem = {x: item.y, y: item.x} return _.find(objects, anotherItem); }

_.find(somearray, someobject)会尝试。这就是为什么我们在上面做的事情:

_.find

最后,undefined会返回对象(如果找到),!!(如果找不到)。我们使用!!undefined将其转换为布尔值(false变为!!someobjecttrue变为df.loc[~df.id.isin(df.id.loc[df.status_id==1])] Out[504]: id name email status_id 3 25 Bill b@b.com 2 4 25 Bill b@b.com 3 5 28 Claire c@c.com 3 。)

答案 1 :(得分:0)

var newArray = _.map(objects, function(item) {
    if (item.x == item.y) return item;
});

var filteredNewArray = _.without(newArray, undefined)

console.log(filteredNewArray)

答案 2 :(得分:0)

您可以使用地图。 这可能会有所帮助,

objects.map((value, index) => {
    return value.x == value.y
})