【问题标题】:Finding unique objects inside parent array of objects在对象的父数组中查找唯一对象
【发布时间】:2020-12-19 00:07:42
【问题描述】:

我有一个对象数组,如下所示:

const myArray = [
    {
      main_query: "query-1",
      conditions: [
        {
          field: "branch_primary",
          query: "1"
        },
        {
          field: "web_domain",
          query: "google.de"
        }
      ]
    },
    {
      main_query: "query-1",
      conditions: [
        {
          field: "branch_primary",
          query: "2"
        },
        {
          field: "web_domain",
          query: "google.de"
        }
      ]
    },
    {
      main_query: "query-1",
      conditions: [
        {
          field: "branch_primary",
          query: "3"
        },
        {
          field: "web_domain",
          query: "google.de"
        }
      ]
    }
];

请注意,我在每个父对象中都嵌套了具有 key: conditions 的对象数组。所有三个主要父对象都有键:main_query 和 conditions

main_query 的值为 string,并且它们对于所有三个主要对象都是相同的。

条件又是对象数组,带有键:字段和查询

除了 field:"primary_branch"query key value 分别为 1、2、3 之外,所有三个主要对象都具有相同的键值对/看起来相同。 p>

我正在使用下面的代码来找出唯一的对象数组。

const keys = ["main_query", "conditions"];
const filtered = myArray.filter(
  ((s) => (o) =>
    ((k) => !s.has(k) && s.add(k))(keys.map((i) => o[i]).join("|")))(
    new Set()
  )
);
const result = filtered.map((o) => Object.fromEntries(keys.map((k) => [k, o[k]])));

console.log(result);

不幸的是,我得到的结果如下:

{
  main_query: "query-1",
  conditions: [{
      field: "branch_primary",
      query: "1"
    },
    {
      field: "web_domain",
      query: "google.de"
    }
  ]
}

但我希望所有三个对象都显示在控制台中,因为“primary_branch”字段具有不同的查询值。

预期输出应该是:

{
  main_query: "query-1",
  conditions: [{
      field: "branch_primary",
      query: "1"
    },
    {
      field: "web_domain",
      query: "google.de"
    }
  ]
}, {
  main_query: "query-1",
  conditions: [{
      field: "branch_primary",
      query: "2"
    },
    {
      field: "web_domain",
      query: "google.de"
    }
  ]
}, {
  main_query: "query-1",
  conditions: [{
      field: "branch_primary",
      query: "3"
    },
    {
      field: "web_domain",
      query: "google.de"
    }
  ]
}

Here my link to the codepen regarding this code.

【问题讨论】:

  • 对于其他对此代码感到困惑的人,它使用了一个名为currying的概念

标签: javascript arrays object duplicates


【解决方案1】:

创建一个函数,将包含对象的数组作为输入,并将另一个数组作为输出,但仅包含内部唯一的对象(适用于任何类型的值或对象)。

function uniqueItems(arr) {
    let uniqueArr = [];
    arr.forEach(el => {
        if (!uniqueArr.includes(el)) {
            uniqueArr.push(el);
        };
    });
    return uniqueArr;
};

【讨论】:

  • OP 是关于对象数组的。在uniqueItems([{a:1},{a:1}]) 上尝试您的代码。这两个对象都是“独特的”,因为它们只是不同的对象,但可能不是 OP 所需要的。更重要的是,您的答案没有提供如何解决 OP 问题的信息
  • 对不起老兄,这比你想象的要复杂一点@smunteanu
  • 如果可以facepalm,我会降低自己的答案
  • @smunteanu 学习一下,效果很好:-)
【解决方案2】:

我会使用JSON.stringify 为您的对象创建一个标识符,考虑到我们不应该依赖对象中的属性顺序,并且conditions 中的对象顺序不相关,所以我建议排序按字段的条件,并将所有内容编码为数组:

const stringify = ({main_query, condtions}) =>
    JSON.stringify([
        main_query, 
        ...condtions.map(({field, query}) => [field, query])
                    .sort((a, b) => a[0].localeCompare(b[0]))
    ]);

let result = Array.from(new Map(myArray.map(query => [stringify(query), query])).values());

【讨论】:

  • 哇,它看起来像一个很棒的解决方案@trincot....让我试一试并尝试理解您的代码..我会在测试后尽快回复您..谢谢很多
  • 所以,它就像一个魅力......非常感谢,我接受你的回答......干杯
【解决方案3】:

这将给出一个唯一的对象数组

for(var myObj of myArray) {
    var set = new Set();
    for(var i = 0; i < myObj.conditions.length; i++) {
        var condition = myObj.conditions[i];
        var strCond = JSON.stringify(condition);
        if(set.has(strCond)) {
            myObj.conditions.splice(i, 1);
            i--;
            continue;
        }
        set.add(strCond);
    }
}
console.log(myArray)

【讨论】:

  • const myArray = [{conditions:[1]},{conditions:[1]}] 上尝试您的代码,它会打印原始数组...
  • @arVi,我测试过了,很抱歉它不能正常工作。你可以试试我的 codepen 并自己测试一下。。对不起
【解决方案4】:

比其他答案复杂得多,但这是我的工作解决方案:

function uniqueItems(arr) {
    var uniqueArr = [], uniqueArrStrings = [];
    arr.forEach(el => {
        if(!uniqueArrStrings.includes(JSON.parse(JSON.stringify(el).toString()).toString())) {
            uniqueArrStrings.push(JSON.parse(JSON.stringify(el).toString()).toString());
            uniqueArr.push(JSON.parse(JSON.stringify(el).toString()));
        };
    });
    return uniqueArr;
};

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 2021-04-14
    • 2018-08-30
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多