通过检查两个元素从数组中获取重复值

     2023-03-13     16

关键词:

【中文标题】通过检查两个元素从数组中获取重复值【英文标题】:Get duplicated values from an array by checking with two element 【发布时间】:2018-10-26 01:30:01 【问题描述】:

如果我的数组有以下数据

let array = [ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 ,
         name: "Suresh", SalseVersion: 12, MarketingCode: 13 ,
         name: "Siva", SalseVersion: 10, MarketingCode: 14 ,
         name: "Sakthi", SalseVersion: 10, MarketingCode: 11 ,...]

那么我期待下面的结果

[ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 ,
  name: "Sakthi", SalseVersion: 10, MarketingCode: 11 ]

如果我的数组有以下数据

let array = [ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 ,
         name: "Suresh", SalseVersion: 12, MarketingCode: 14,
         name: "Siva", SalseVersion: 12, MarketingCode: 14 ,
         name: "Sakthi", SalseVersion: 10, MarketingCode: 11 ,...]

那么我期待下面的结果。

        [ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 ,
         name: "Sakthi", SalseVersion: 10, MarketingCode: 11 
         name: "Suresh", SalseVersion: 12, MarketingCode: 14,
         name: "Siva", SalseVersion: 12, MarketingCode: 14 ]

我试过这种方式:Get all non-unique values (i.e.: duplicate/more than one occurrence) in an array

let arr = [ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 ,
         name: "Suresh", SalseVersion: 12, MarketingCode: 13 ,
         name: "Siva", SalseVersion: 10, MarketingCode: 14 ,
         name: "Sakthi", SalseVersion: 10, MarketingCode: 11 ]


var sorted_arr = arr.slice().sort();
var results = [];
for (var i = 0; i < sorted_arr.length - 1; i++) 
    if (sorted_arr[i + 1].SalesVersion == sorted_arr[i].SalesVersion && sorted_arr[i + 1].MarketingCode == sorted_arr[i].MarketingCode) 
        results.push(sorted_arr[i]);
    


console.log(results);

但无法获取重复值。你能解决这个问题吗?

注意:请注意,如果SalseVersionMarketingCode 的值为string/number/Boolean,它应该也可以工作。

因为我尝试了以下一些答案,但我得到了以下错误。

【问题讨论】:

【参考方案1】:

你可以使用reduce

第一个reduce 将使用SalseVersionMarketingCode 的串联值对值进行分组。

第二个reduce 将检查组是否有超过 1 个元素。如果有concat,则将值放入1个数组中。

let array = [ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 , name: "Suresh", SalseVersion: 12, MarketingCode: 14, name: "Siva", SalseVersion: 12, MarketingCode: 14 , name: "Sakthi", SalseVersion: 10, MarketingCode: 11 ];

let result = Object.values(array.reduce((c, v) => 
  let k = v.SalseVersion + '-' + v.MarketingCode;
  c[k] = c[k] || [];
  c[k].push(v);
  return c;
, )).reduce((c, v) => v.length > 1 ? c.concat(v) : c, []);

console.log( result );

【讨论】:

【参考方案2】:

您似乎正在尝试查找在数组中至少存在一个具有相似属性的其他元素的元素。您可以为此使用.filter,然后使用sort

const dupesFromArr = array => 
  const filteredArr = array.filter(( name, SalseVersion, MarketingCode , i, arr) => (
    arr.find((item, findI) => (
      findI !== i &&
      SalseVersion === item.SalseVersion &&
      MarketingCode === item.MarketingCode
    ))
  ));
  return filteredArr.sort((a, b) =>
    String(a.SalseVersion).localeCompare(String(b.SalseVersion), 'kn') ||
    String(a.MarketingCode).localeCompare(String(b.MarketingCode), 'kn')
  );
;

console.log(dupesFromArr([name:"Ramesh",SalseVersion:10,MarketingCode:11,name:"Suresh",SalseVersion:12,MarketingCode:13,name:"Siva",SalseVersion:10,MarketingCode:14,name:"Sakthi",SalseVersion:10,MarketingCode:11]))
console.log(dupesFromArr([name:"Ramesh",SalseVersion:10,MarketingCode:11,name:"Suresh",SalseVersion:12,MarketingCode:14,name:"Siva",SalseVersion:12,MarketingCode:14,name:"Sakthi",SalseVersion:10,MarketingCode:11]))

【讨论】:

我在filteredArr.sort((a, b) =&gt; b.SalesVersion - a.SalesVersion || b.MarketingCode - a.MarketingCode); 中遇到错误赋值的左侧必须是任何int 或枚举变量,因为SalesVersion 属性类型是字符串。 是的,我已经正确复制了它。但是打字稿不允许这样做 您的编辑器告诉您 MarketingCode 属性是 string,但您发布的代码显示它们是整数。这里没有加起来。 @RameshRajendran,您可以使用 + 运算符强制结果。像这样的东西:return filteredArr.sort((a, b) =&gt; +a.SalseVersion - (+b.SalseVersion) || +a.MarketingCode - (+b.MarketingCode)); @Mihai 如果MarketingCodestring,那么+Marketing 将是NaN【参考方案3】:

您可以将您的代码更新为以下

let arr = [ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 ,
     name: "Suresh", SalseVersion: 12, MarketingCode: 14,
     name: "Siva", SalseVersion: 12, MarketingCode: 14 ,
     name: "Sakthi", SalseVersion: 10, MarketingCode: 11 ,
     name: "OP", SalseVersion: 10, MarketingCode: 11 ]

// You need to write the custom sort function
var sorted_arr = arr.slice().sort((a,b) => 
     if(a.SalseVersion === b.SalseVersion) 
          return a.MarketingCode- b.MarketingCode;
      
      return a.SalseVersion - b.SalseVersion;
);
var results = [];
for (var i = 0; i < sorted_arr.length - 1; i++) 
    if (sorted_arr[i + 1].SalesVersion == sorted_arr[i].SalesVersion && sorted_arr[i + 1].MarketingCode == sorted_arr[i].MarketingCode) 
        /* push both the elements in case of match with only exception 
         * being if it has been pushed previously where there are more than 2 matches */
       if (i >= 1 && sorted_arr[i - 1].SalesVersion == sorted_arr[i].SalesVersion && sorted_arr[i - 1].MarketingCode == sorted_arr[i].MarketingCode) 
         results.push(sorted_arr[i+1]);
        else 
         results.push(sorted_arr[i], sorted_arr[i+1]);
                   
    


console.log(results);

【讨论】:

【参考方案4】:

基本上可以继续排序,但是使用想要的键,这会返回一种分组数组,其中所有想要的键及其值都在直接附近。

然后您可以通过检查所有具有实际值的键和前任或后继来过滤数组。

var array = [ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 ,  name: "Suresh", SalseVersion: 12, MarketingCode: 13 ,  name: "Siva", SalseVersion: 10, MarketingCode: 14 ,  name: "Sakthi", SalseVersion: 10, MarketingCode: 11 ],
    keys = ['SalseVersion', 'MarketingCode'],
    result = array
        .sort((a, b) => 
            var d;
            keys.some(k => d = a[k] - b[k]);
            return d;
        )
        .filter((o, i, a) => 
            keys.every(k => a[i - 1] && a[i - 1][k] === o[k]) ||
            keys.every(k => a[i + 1] && o[k] === a[i + 1][k])
        );

console.log(result);
.as-console-wrapper  max-height: 100% !important; top: 0; 

未排序数据的单循环方法,使用哈希表临时收集组的第一个对象或仅指示组的重复项。

var array = [ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 ,  name: "Suresh", SalseVersion: 12, MarketingCode: 13 ,  name: "Siva", SalseVersion: 10, MarketingCode: 14 ,  name: "Sakthi", SalseVersion: 10, MarketingCode: 11 ],
    keys = ['SalseVersion', 'MarketingCode'],
    result = array.reduce((hash => (r, o) => 
        var key = keys.map(k => o[k]).join('|');
        if (key in hash) 
            if (hash[key]) 
                r.push(hash[key]);
                hash[key] = false;
            
            r.push(o);
         else 
             hash[key] = o;
        
        return r;
    )(Object.create(null)), []);

console.log(result);
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

从两个数组中获取唯一值并将它们放在另一个数组中[重复]

】从两个数组中获取唯一值并将它们放在另一个数组中[重复]【英文标题】:Gettheuniquevaluesfromtwoarraysandputtheminanotherarray[duplicate]【发布时间】:2013-04-0112:12:32【问题描述】:我在javascript中有两个数组-:vararray1=[\'12\',\'1\',\'10\',\'19\'... 查看详情

通过属性值从对象数组中获取JavaScript对象[重复]

】通过属性值从对象数组中获取JavaScript对象[重复]【英文标题】:GetJavaScriptobjectfromarrayofobjectsbyvalueofproperty[duplicate]【发布时间】:2012-12-0711:59:58【问题描述】:假设我有一个包含四个对象的数组:varjsObjects=[a:1,b:2,a:3,b:4,a:5,b:6,a:... 查看详情

通过属性值从对象数组中获取JavaScript对象[重复]

】通过属性值从对象数组中获取JavaScript对象[重复]【英文标题】:GetJavaScriptobjectfromarrayofobjectsbyvalueofproperty[duplicate]【发布时间】:2012-12-0711:59:58【问题描述】:假设我有一个包含四个对象的数组:varjsObjects=[a:1,b:2,a:3,b:4,a:5,b:6,a:... 查看详情

从 AJAX 请求中获取数组值 [重复]

...述】:我有一个脚本,它读取一个JSON文件,然后用每个元素的name属性填充一个数组。HTML<scriptsrc="https://code.jquery.com/jquery-2.2.4.min.js"></script>&l 查看详情

从列表中获取总和为值的元素数组[重复]

】从列表中获取总和为值的元素数组[重复]【英文标题】:Getarrayofelementsfromlistthatsumtovalue[duplicate]【发布时间】:2021-11-2001:02:50【问题描述】:下面是我的问题的简化版本,下面的背景摘要提供了更大的背景。问题:创建一个函... 查看详情

从jquery中的数组中获取唯一元素和元素的数量[重复](代码片段)

...tallation];所以我要打印,ACService=2;ACInstallation=2如何打印这两个值。提前致谢。答案你可以使用reduce()。使用一个对象作为累加器,它将数组项作为键和值作为计数。然后在forEach()上使用Object.entrries来迭代它们的键和值。 con... 查看详情

如何从数组中获取随机元素[重复]

】如何从数组中获取随机元素[重复]【英文标题】:Howtogetrandomelementsfromanarray[duplicate]【发布时间】:2011-11-0118:52:23【问题描述】:可能重复:JavaScript:Gettingrandomvaluefromanarrayvarnumbers=newArray(\'1\',\'2\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'10\... 查看详情

从数组中获取保留的内存量[重复]

...】:考虑以下情况:intMyClass::MyMethod(char*myChar)我是否能够通过myChar获得内存(堆和堆栈)内的保留空间量?例如,如果myChar指向一个名为charmyArray[10]的数组的第一个元素:通过使用 查看详情

js基础数组类型(代码片段)

...索引for/of每次循环取其中的值而不是索引迭代器方法keys通过迭代对象获取索引values通过迭代对象获取值entries返回数组所有键值对扩展方法every用于递归的检测元素some递归的检 查看详情

从数组数组中获取唯一值[重复]

】从数组数组中获取唯一值[重复]【英文标题】:Getuniquevaluesfromarrayofarrays[duplicate]【发布时间】:2019-11-2309:32:52【问题描述】:我有以下数组letarr=[["s1@example.com","s2@example.com"],["s1@example.com","s3@example.com"]]我想从这个数组中获取唯... 查看详情

检查数组中的元素[重复]

】检查数组中的元素[重复]【英文标题】:Checkforelementinarray[duplicate]【发布时间】:2016-08-0612:30:03【问题描述】:我正在尝试检查一个元素是否已存在于数组中。我知道至少有两种不同的方法:[1]和[2]。我测试了他们两个,但在... 查看详情

从对象数组中获取值[重复]

】从对象数组中获取值[重复]【英文标题】:Getvaluesfromarrayofobjects,insideanobject[duplicate]【发布时间】:2021-11-1707:32:51【问题描述】:所以,假设我有这个对象,在它里面,我有一个对象数组。letpartys="id":241,"name":"RockParty","type":"part... 查看详情

两个数组的最小值[重复]

】两个数组的最小值[重复]【英文标题】:Minimumvaluefromtwoarrays[duplicate]【发布时间】:2019-02-0806:40:03【问题描述】:我有两个数组a=([2,3,5])和b=([-2,3.2,10])如何从这两个数组中获取最小值?预期答案是-2【问题讨论】:【参考方案1... 查看详情

如何检查数组中之前是不是出现过元素[重复]

】如何检查数组中之前是不是出现过元素[重复]【英文标题】:Howtocheckifanelementhasoccuredbeforeinthearray[duplicate]如何检查数组中之前是否出现过元素[重复]【发布时间】:2015-12-1600:21:56【问题描述】:例如,以下问题说明:编写一个... 查看详情

从两个排序数组中获取前 K 项而不合并它们

...治之的算法,我试图将两个数组与中间元素分开,然后我检查中间的数组是否大于另一个我将数组的末尾移到中间,然后我将k减少到中间,我将另一个数组从它 查看详情

数组对象去重

...个数组中返回给定元素第一次出现的索引-filterfilter()方法通过给定的条件(一个函数)来返回一个新的数组。换句话说,如果轮到的这个元素进入了条件函数后结果为true,那么它将被加入到过滤后的新数组中,反之则不会加入到结... 查看详情

如何从两个蜂巢数组中获取不匹配的元素

】如何从两个蜂巢数组中获取不匹配的元素【英文标题】:Howtogetunmatchedelementsfromtwohivearrays【发布时间】:2021-03-3102:16:31【问题描述】:我正在寻找一个hive函数和查询以从Hive中的两个数组中获取不匹配的元素。假设数组是A=["Hel... 查看详情

如何从包含 JavaScript 中重复项的数组中获取唯一值数组? [复制]

】如何从包含JavaScript中重复项的数组中获取唯一值数组?[复制]【英文标题】:HowtogetanarrayofuniquevaluesfromanarraycontainingduplicatesinJavaScript?[duplicate]【发布时间】:2012-11-0907:17:31【问题描述】:给定一个[\'0\',\'1\',\'1\',\'2\',\'3\',\'3\',\'... 查看详情