获取所有阵列的独特项目 - Handlebars

Get the unique items for all array - Handlebars

使用我使用的代码,我只取得了部分成功。 当所有数组的值都相等时,是否可以有一个项目? (即 "citta":"Roma")。

现在我得到以下结果:-罗马-那不勒斯-罗马-罗马

我想要以下结果:- 罗马 - 那不勒斯。我不想重复 "Roma".

谁能帮帮我?谢谢

{
    "test": [
    {
        "33": [
        {
          "name": "Antonio",
          "citta": "Roma",
          "orari":  "2020-01-11T10:50:00.000+01:00"
      },
            {
          "name": "Federico",
          "citta": "Roma"

      }
      ]
    },
      {
        "34": [
        {
           "name": "Antonio",
          "citta": "Napoli"

      }
      ]
    },
     { "36": [
        {
           "name": "Antonio",
          "citta": "Roma"

      }
      ]
    }
  ]
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script id="sourceTemplate" type="text/x-handlebars-template">
<div>
 {{#each test}} <ul> <li>{{#each this}}{{#eachUnique this}} - {{citta}}{{/eachUnique}}  {{/each}}</li> </ul> {{/each}} 
</div>
</script>
<br/>
<div id="resultPlaceholder">
</div>
<script>
var seasons_data_url = "working-data-file.json";
  
$(document).ready(function(){
  $.getJSON(seasons_data_url,
    function (data) {
      var mysource = $('#sourceTemplate').html();
      var mytemplate = Handlebars.compile(mysource);
      var myresult = mytemplate(data)
      $('#resultPlaceholder').html(myresult);
  });
});
  Handlebars.registerHelper('eachUnique', function(array, options) {
  // this is used for the lookup
  var  dupCheck = {};
  // template buffer
  var buffer = '';
  for( var i=0; i< array.length; i++){
    var entry = array[i];
    var uniqueKey = entry.IP + entry.What + entry.When + entry.How;
    // check if the entry has been added already
    if(!dupCheck[uniqueKey]){
      // here there are only unique values
      dupCheck[uniqueKey] = true;
      // add this in the template
      buffer += options.fn(entry);
    }
  }
  // return the template compiled
  return buffer;
});
</script>

有几种方法可以实现唯一数组。

原版 JavaScript

使用香草 JavaScript 你可以使用 Set

  var foo = new Set();
  test.forEach(item => foo.add(item.citta));
  return Array.from(foo);

更好的方法是将非唯一数组本身传递给集合承包商,它将从该数组中创建唯一集合

  return Array.from(new Set(test.map(item => item.citta)));

使用Lodash.js

Lodash.js 有一个 uniq 函数。 我还建议使用 map and chain

  return _.chain(test)
    .map(item => item.citta)
    .uniq()
    .value();

您的示例的解决方案是:

你基本上想要遍历你的对象并从中创建一个 Set 以将你的 citta 包含在每个基础对象中, 然后,您想将此 Set 制作的 Array 添加到您的 context 并更改您的 #each 以使用该数组。

这里是使用您在评论中提供的示例解决问题的代码修改。

<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script id="sourceTemplate" type="text/x-handlebars-template">
<div>
 {{#each cittas}} <ul> <li>{{this}}</li> </ul> {{/each}} 
</div>
</script>
<br/>
<div id="resultPlaceholder">
</div>
<script src="https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@7.2.0/dist/js/autoComplete.min.js"></script>
<script>
$(document).ready(function() {
  var context = {
    "test": [
    {
        "33": [
        {
          "name": "Antonio",
          "citta": "Roma",
          "orari":  "2020-01-11T10:50:00.000+01:00"
      },
            {
          "name": "Federico",
          "citta": "Roma",
          "orari":  "2020-01-11T12:50:00.000+01:00"
      }
      ]
    },
      {
        "34": [
        {
           "name": "Antonio",
          "citta": "Napoli",
          "orari":  "2020-01-11T10:50:00.000+01:00"
      }
      ]
    },
        {
        "35": [
        {
           "name": "Antonio",
          "citta": "Roma",
          "orari":  "2020-01-11T10:50:00.000+01:00"
      }
      ]
    },
     { "36": [
        {
           "name": "Antonio",
          "citta": "Roma",
          "orari":  "2020-01-11T10:50:00.000+01:00"
      }
      ]
    }
  ]
};
context.cittas = Array.from(context.test.reduce((foo, item) => {
  Object.values(item).forEach(a => {
    a.forEach(b => {
      foo.add(b.citta);
    });
  });
  return foo;
}, new Set()))
  var source = $("#sourceTemplate").html();
  var template = Handlebars.compile(source);
  var html = template(context);
  $("#resultPlaceholder").html(html);
});
  Handlebars.registerHelper('eachUnique', function(array, options) {
  // this is used for the lookup
  var  dupCheck = {};
  // template buffer
  var buffer = '';
  for( var i=0; i< array.length; i++){
    var entry = array[i];
    var uniqueKey = entry.IP + entry.What + entry.When + entry.How;
    // check if the entry has been added already
    if(!dupCheck[uniqueKey]){
      // here there are only unique values
      dupCheck[uniqueKey] = true;
      // add this in the template
      buffer += options.fn(entry);
    }
  }
  // return the template compiled
  return buffer;
});

</script>