查找JavaScript对象数组中某些键的重复项,并将相关键设置为true

时间:2017-08-29 09:46:50

标签: javascript duplicates

我有一个JS对象数组:

  var a = [{a:"a1",b:"b",c:"c",prop:false},
           {a:"a1",b:"b",c:"c",prop:false},
           {a:"a",b:"b",c:"c",prop:false},
           {a:"a2",b:"b",c:"c",prop:false},
           {a:"a3",b:"b",c:"c",prop:false},
           {a:"a1",b:"b",c:"c",prop:false}];

我必须找到最后一个元素的重复但没有考虑键prop:当我找到它们时,相关的prop boolean必须设置为true

我做了世界上最简单的事情并且工作得很好但是如果有JS可以做的事情(没有第三方图书馆)我会徘徊,更好地在&#34;优雅&#34;,现代性或表现:< / p>

var toTest = a[a.length-1];
for(var i=0;i<a.length;i++){
      if(toTest.a==a[i].a && toTest.b==a[i].b && toTest.c==a[i].c){
         a[i].prop = true;
         a[a.length-1].prop = true;
      }
    }

赞赏任何提示

4 个答案:

答案 0 :(得分:1)

Array.filter()与仅比较abc的功能一起使用。

编辑:我完全取代了之前的答案。我认为Array.filter()是按照要求搜索数组中最后一个条目的重复项的方法。

答案 1 :(得分:1)

你拥有的就是它。你可以做一些调整,但它很好,因为除了你想要提前一步,i < a.length - 1时(因为你不想将最后一个条目与自身进行比较并设置) prop错误地)。

可以做的一些调整:

  • a[a.length-1].prop = true;可以是toTest.prop = true;
  • 您可以将a[i]缓存到变量,而不是每次都查找
  • 您可以缓存abc,而不是每次都在对象上查找它们(但如果重要的话,JavaScript引擎会这样做)
  • 在ES2015 +中,您可以使用解构分配来获取abc

例如:

// Caching the last item
var last = a[a.length - 1];
// Caching the values to check
var checka = last.a, checkb = last.b, checkc = last.c;
// Stop at i < a.length - 1, caching that to l
for (var i = 0, l = a.length - 1; i < l; ++i) {
    // Cache a[i]
    var entry = a[i];
    if (entry.a == checka && entry.b == checkb && entry.c == checkc) {
        entry.prop = last.prop = true;
    }
}

实时复制:

var a = [{a:"a1",b:"b",c:"c",prop:false},
           {a:"a1",b:"b",c:"c",prop:false},
           {a:"a",b:"b",c:"c",prop:false},
           {a:"a2",b:"b",c:"c",prop:false},
           {a:"a3",b:"b",c:"c",prop:false},
           {a:"a1",b:"b",c:"c",prop:false}];

// Caching the last item
var last = a[a.length - 1];
// Caching the values to check
var checka = last.a, checkb = last.b, checkc = last.c;
// Stop at i < a.length - 1, caching that to l
for (var i = 0, l = a.length - 1; i < l; ++i) {
    // Cache a[i]
    var entry = a[i];
    if (entry.a == checka && entry.b == checkb && entry.c == checkc) {
        entry.prop = last.prop = true;
    }
}
console.log(a);
.as-console-wrapper {
  max-height: 100% !important;
}

这是ES2015 +版本,仅供参考:

const last = a[a.length - 1];
const {a: checka, b: checkb, c: checkc} = last;
for (let i = 0, l = a.length - 1; i < l; ++i) {
    const {a: thisa, b: thisb, c: thisc} = a[i];
    if (thisa == checka && thisb == checkb && thisc == checkc) {
        a[i].prop = last.prop = true;
    }
}

实时复制:

const a = [{a:"a1",b:"b",c:"c",prop:false},
           {a:"a1",b:"b",c:"c",prop:false},
           {a:"a",b:"b",c:"c",prop:false},
           {a:"a2",b:"b",c:"c",prop:false},
           {a:"a3",b:"b",c:"c",prop:false},
           {a:"a1",b:"b",c:"c",prop:false}];

const last = a[a.length - 1];
const {a: checka, b: checkb, c: checkc} = last;
for (let i = 0, l = a.length - 1; i < l; ++i) {
    const {a: thisa, b: thisb, c: thisc} = a[i];
    if (thisa == checka && thisb == checkb && thisc == checkc) {
        a[i].prop = last.prop = true;
    }
}
console.log(a);
.as-console-wrapper {
  max-height: 100% !important;
}

是否符合您的任何标准取决于您。

答案 2 :(得分:1)

您可以使用Array.forEachArray.every的组合。创建要测试的密钥列表,并在每次迭代中检查这些密钥并更新对象。

a[a.length-1].prop = true看起来不需要我,因为你没有删除该项目,所以它将在最后一次迭代中更新。

var a = [{a:"a1",b:"b",c:"c",prop:false},
         {a:"a1",b:"b",c:"c",prop:false},
         {a:"a",b:"b",c:"c",prop:false},
         {a:"a2",b:"b",c:"c",prop:false},
         {a:"a3",b:"b",c:"c",prop:false},
         {a:"a1",b:"b",c:"c",prop:false}];
var toTest = a[a.length -1];
var keysToTest = ['a', 'b', 'c'];

a.forEach((o)=>{
  var valid = keysToTest.every((k) => o[k] === toTest[k]);
  if(valid){
    o.prop = true;
  }
});

console.log(a)

答案 3 :(得分:1)

您可以使用普通的forEach循环

&#13;
&#13;
var a = [{a:"a1",b:"b",c:"c",prop:false}, {a:"a1",b:"b",c:"c",prop:false}, {a:"a",b:"b",c:"c",prop:false}, {a:"a2",b:"b",c:"c",prop:false},{a:"a1",b:"b",c:"c",prop:false},{a:"a1",b:"b",c:"c",prop:false}];     
var toTest = a[a.length-1];              
a.forEach(function(item){
  item.prop = (item.a == toTest.a && item.b == toTest.b && item.c == toTest.c) ? true : false;
});
console.log(a);
&#13;
&#13;
&#13;