首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测数组中的对象是否具有一个相同的属性,但与其他对象具有不同的其他属性

检测数组中的对象是否具有一个相同的属性,但与其他对象具有不同的其他属性
EN

Stack Overflow用户
提问于 2016-05-25 14:45:24
回答 2查看 47关注 0票数 1

拿着这个数组:

代码语言:javascript
复制
[
  {"color": "blue","type": 1},
  {"color": "red","type": 1},
  {"color": "blue","type": 1},
  {"color": "green","type": 1},
  {"color": "green","type": 1},
  {"color": "red","type": 2},
  {"color": "red","type": 1},
  {"color": "green","type": 2},
  {"color": "red","type": 3},
];

如何查找数组中哪个“颜色”具有不同的“类型”(与所有其他具有相同“名称”的对象相比)?

我希望能够遍历这个数组并创建第二个数组,如下所示:

代码语言:javascript
复制
{red, green}

请注意,蓝色是通用的,因为所有具有“颜色”的对象都有相同的“类型”。

我得到的最接近的是:https://jsfiddle.net/0wgjs5zh/,但是它将所有颜色添加到添加了不同类型的数组中:

代码语言:javascript
复制
arr.forEach(function(item){
  if(newArr.hasOwnProperty(item.color+ '-' +item.type)) {
   // newArr[item.color+ '-' +item.type].push(item);
  }
  else {
    newArr[item.color+ '-' +item.type] = item;
  }
});

// RESULT
{blue-1, green-1, green-2, red-1, red-2, red-3}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-25 14:57:08

您可以使用两次传递,一次用于集合,一次用于生成结果数组。

代码语言:javascript
复制
var array = [{ "color": "blue", "type": 1 }, { "color": "red", "type": 1 }, { "color": "blue", "type": 1 }, { "color": "green", "type": 1 }, { "color": "green", "type": 1 }, { "color": "red", "type": 2 }, { "color": "red", "type": 1 }, { "color": "green", "type": 2 }, { "color": "red", "type": 3 }, ],
    result,
    object = Object.create(null);

array.forEach(function (a) {
    object[a.color] = object[a.color] || {};
    object[a.color][a.type] = true;
});

result = Object.keys(object).filter(function (k) {
    return Object.keys(object[k]).length > 1;
});

console.log(result);

票数 4
EN

Stack Overflow用户

发布于 2016-05-25 15:19:23

我的解决方案如下所示

代码语言:javascript
复制
var cls = [
  {"color": "blue","type": 1},
  {"color": "red","type": 1},
  {"color": "blue","type": 1},
  {"color": "green","type": 1},
  {"color": "green","type": 1},
  {"color": "red","type": 2},
  {"color": "red","type": 1},
  {"color": "green","type": 2},
  {"color": "red","type": 3},
],

    map = cls.reduce((p,c) => (p[c.color] ? !~p[c.color].indexOf(c.type) && p[c.color].push(c.type)
                                          : p[c.color] = [c.type], p),{}),
 result = Object.keys(map).reduce((p,c) => map[c].length > 1 && p.concat(c) || p,[]);

console.log(result);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37440579

复制
相关文章

相似问题

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