首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Javascript/underscorejs找到包含对象的数组的交集?

如何使用Javascript/underscorejs找到包含对象的数组的交集?
EN

Stack Overflow用户
提问于 2013-02-06 07:04:18
回答 4查看 6.9K关注 0票数 6

我不知道如何找到这组数组的交集:

代码语言:javascript
运行
复制
[
 [
  {"name":"product1","light":"1"},
  {"name":"product2","light":"2"},
  {"name":"product5","light":"5"},
  {"name":"product4","light":"4"}
 ],
 [
  {"name":"product2","light":"2"},
  {"name":"product3","light":"3"},
  {"name":"product4","light":"4"}
 ],[...more arrays with objects]
]

这只是示例数据,我有很多更改,但使用该结构。我希望返回的交集看起来如下(相交对象的一个数组):

代码语言:javascript
运行
复制
[
 {"name":"product2","light":"2"},
 {"name":"product4","light":"4"},
]

我和LoDashjs和Underscorejs一起尝试过这个:

代码语言:javascript
运行
复制
_.intersectionObjects = _.intersect = function(array) {
var slice = Array.prototype.slice; // added this line as a utility
var rest = slice.call(arguments, 1);
return _.filter(_.uniq(array), function(item) {
  return _.every(rest, function(other) {
    //return _.indexOf(other, item) >= 0;
    return _.any(other, function(element) { return _.isEqual(element, item); });
  });
});
};

我需要这一点,因为我正在尝试创建一个标签系统使用knockoutjs。我有一个分类标签按钮的布局,这些按钮可以在点击时写入一个“过滤器”可观察数组,唯一剩下的就是找到包含在这个可观察数组中的过滤产品的交集。

请帮帮我,我已经试着解决这个问题已经连续两天了,但缺乏javascript知识来解决它。提前感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-06 07:48:39

尝试添加它们的应用方法:

代码语言:javascript
运行
复制
  var myArr = [
    [
      {"name":"product1","light":"1"},
      {"name":"product2","light":"2"},
      {"name":"product5","light":"5"},
      {"name":"product4","light":"4"}
    ],
    [
      {"name":"product2","light":"2"},
      {"name":"product3","light":"3"},
      {"name":"product4","light":"4"}
    ]
  ]

  _.intersectionObjects = _.intersect = function(array) {
    var slice = Array.prototype.slice;
    var rest = slice.call(arguments, 1);
    return _.filter(_.uniq(array), function(item) {
      return _.every(rest, function(other) {
        return _.any(other, function(element) {
          return _.isEqual(element, item);
        });
      });
    });
  };

  var myIntersection = _.intersectionObjects.apply(_, myArr);

  for (var i = 0; i < myIntersection.length; i++) {
    console.log(myIntersection[i]);
  }

  // Sample Output:
  // Object {name: "product2", light: "2"}
  // Object {name: "product4", light: "4"}
票数 6
EN

Stack Overflow用户

发布于 2016-09-07 00:46:49

这是我用过的一种方法,看起来效果很好。

代码语言:javascript
运行
复制
var arr1 = [{"id":"1"},{"id":"2"},{"id":"3"}];
var arr2 = [{"id":"1"},{"id":"3"}];

function match(item){
var isMatch = _.matcher(item);
var matches = _.filter(arr2, isMatch);
  return matches[0];
}

var matchArray = _.compact(_.map(arr1, function(val){ return match(val)}));

document.write(JSON.stringify(matchArray));
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

票数 3
EN

Stack Overflow用户

发布于 2013-02-06 08:13:16

如果您只是比较对象本身,则可能会遇到错误,因为这将返回false:

代码语言:javascript
运行
复制
var o1 = {"foo":"bar"};
var o2 = {"foo":"bar"};
return o1 == o2;

您需要比较对象内部的值,并根据以下内容进行交互:

这里的JSFiddle可以做你喜欢做的事。http://jsfiddle.net/turiyag/bWrQW/6/

代码语言:javascript
运行
复制
function valueIntersect(a1, a2) {
    var aReturn = [];
    for(i1 in a1) {
        o1 = a1[i1];
        for (i2 in a2) {
            o2 = a2[i2];
            if(equals(o1,o2)) {
                aReturn.push(o1);
                break;
            }
        }
    }
    return aReturn;
}

function equals(o1, o2) {
    if (!o2 || o1.length != o2.length) {
        return false;
    }
    for (i in o1) {
        if (o1[i] !== o2[i]) {
            return false;
        }
    }
    return true;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14723412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档