Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在对象的父数组中查找唯一对象_Javascript_Arrays_Object_Duplicates - Fatal编程技术网

Javascript 在对象的父数组中查找唯一对象

Javascript 在对象的父数组中查找唯一对象,javascript,arrays,object,duplicates,Javascript,Arrays,Object,Duplicates,我有一组对象,如下所示: const myArray = [ { main_query: "query-1", conditions: [ { field: "branch_primary", query: "1" }, { field: "web_domain",

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

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"
        }
      ]
    }
];
请注意,我在每个父对象中嵌套了带有键:条件的对象数组。所有三个主要父对象都有键:main\u query and conditions

main_query的值为string,这三个主要对象的值相同

使用键:field和query

所有三个主要对象都有相同的键值对/外观相同,除了字段的查询键值:“primary_branch”分别为1、2、3

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

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"
    }
  ]
}

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


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


我将使用
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());

我将使用
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());

这将提供一个唯一的对象数组

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)
for(myArray的var myObj){
变量集=新集();
对于(变量i=0;i
这将提供一个独特的对象数组

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)
for(myArray的var myObj){
变量集=新集();
对于(变量i=0;i
比另一个答案复杂得多,但这里是我的工作解决方案:

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;
};

比另一个答案复杂得多,但这里是我的工作解决方案:

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;
};


OP是关于对象数组的。在
唯一项([{a:1},{a:1}])
上尝试您的代码。这两个对象都是“唯一”的,因为它们只是不同的对象,但可能不是OP需要的。。更重要的是,你的答案并没有提供如何解决OP问题的信息抱歉,伙计,这比你想象的要复杂得多@smunteanuI如果可以的话,我会降低我自己的答案的等级facepalm@smunteanu只要从中学习,就会有很好的效果:-)OP是关于对象数组的。在
唯一项([{a:1},{a:1}])
上尝试您的代码。这两个对象都是“唯一”的,因为它们只是不同的对象,但可能不是OP需要的。。更重要的是,你的答案并没有提供如何解决OP问题的信息抱歉,伙计,这比你想象的要复杂得多@smunteanuI如果可以的话,我会降低我自己的答案的等级facepalm@smunteanu就从中学习吧,结果很好:-)哇,这看起来像是一个很棒的解决方案@trincot…让我试一试,试着理解你的代码..我会在测试后尽快回复你..非常感谢,它工作得很有魅力..非常感谢,我接受你的答案..干杯,这看起来像是一个很棒的解决方案@trincot…让我试一试,试着理解你的代码..我会在测试后尽快给你回复..非常感谢,它工作得很有魅力..非常感谢,我接受你的答案..在
const myArray=[{conditions:[1]},{conditions:[1]},{conditions:[1]}上为你的代码加油,它打印原始数组…@arVi,我测试了它,很抱歉它不幸无法工作..您可以尝试我的代码笔并测试自己..对不起,请在
const myArray=[{conditions:[1]},{conditions:[1]}]
上尝试您的代码,它打印原始数组…@arVi,我测试了它,抱歉,不幸的是,它无法工作。您可以尝试我的codepen并测试自己。对不起,对于其他对此代码感到困惑的人,它使用一个名为的概念。对于其他对此代码感到困惑的人,它使用一个名为