【问题标题】:Return each unique instance of value in an array, in a new array在新数组中返回数组中每个唯一的值实例
【发布时间】:2021-08-26 04:31:03
【问题描述】:

我正在尝试编写一个接收以下数组的函数,

var data = [
            {
                name: 'Josh',
                description: 'some data about this guy',
                sortOrder: 'Gold'
            }, 
            {
                name: 'Bill',
                description: 'some data about this guy',
                sortOrder: 'Platinum'
            },
            {
                name: 'Gary',
                description: 'some data about this guy',
                sortOrder: 'Platinum'
            },
            {
                name: 'Phillip',
                description: 'some data about this guy',
                sortOrder: 'Platinum'
            },
            {
                name: 'Bob',
                description: 'some data about this guy',
                sortOrder: 'Gold'
            },
            {
                name: 'Barry',
                description: 'some data about this guy',
                sortOrder: 'Gold'
            },
            {
                name: 'Joe',
                description: 'some data about this guy',
                sortOrder: 'Gold'
            },
            {
                name: 'Ed',
                description: 'some data about this guy',
                sortOrder: 'Silver'
            },
            {
                name: 'Baxter',
                description: 'some data about this guy',
                sortOrder: 'Platinum'
            },
            {
                name: 'Patrick',
                description: 'some data about this guy',
                sortOrder: 'Silver'
            },
            {
                name: 'Stepehn',
                description: 'some data about this guy',
                sortOrder: 'Silver'
            }
];

并给我一个如下所示的数组:

[Platinum, Gold, Silver] <-- The order doesn't matter

因此它将检查数组中的所有sortOrder 值并返回一个数组,其中包含每个唯一sortOrder 的一个实例。

到目前为止,我写的任何东西都会给我每个 sortOrder.... 的多个实例。有人可以帮帮我吗?

如果有帮助的话,我可以访问 underscore.js 库。

【问题讨论】:

标签: javascript underscore.js


【解决方案1】:

这应该很好用(干净的 js):

var orders = [];

for (var i = 0; i < data.length; i++){

    if (data[i].sortOrder && orders.indexOf(data[i].sortOrder) == -1){
        orders.push(data[i].sortOrder);
    }

}

【讨论】:

  • 是什么阻止了多次添加相同的值?重复if ('foo' &amp;&amp; !orders['foo']){ orders.push('foo'); } 不断添加到orders
  • @PaulS。它不应该。可以举个例子吗?
  • @YavorIvanov—orders[data[i].sortOrder] 正在检查 orders 的属性 named GoldPlatinum 等,但它们是数组中的值,而不是属性名称。这只是创建了一个包含所有 sortOrder 值的数组,包括重复值。也许您错过了“...返回一个包含每个唯一 sortOrder 的一个实例的数组。”部分。
  • @PaulS。 OMG :D 我有点惭愧。你说得对,谢谢 :D 我真的很困
【解决方案2】:

试试这个

var result = _.chain(data)
  .pluck('sortOrder')
  .uniq()
  .value();

console.log(result);

Example

【讨论】:

    【解决方案3】:

    带下划线:

    console.log(_.chain(data).pluck('sortOrder').uniq().value());
    

    【讨论】:

      【解决方案4】:

      由于值是 String,我们可以通过 vanilla JavaScript

      中的 Object
      var a = (function (arr) {
          var i, o = {};
      
          for (i = 0; i < arr.length; ++i)
              o[arr[i].sortOrder] = true;
      
          return Object.keys(o);
      }(data));
      

      【讨论】:

        【解决方案5】:

        不使用任何其他库:

        var results = [];
        for(var i = 0; i < data.length; ++i){
            if(results.indexOf(data[i].sortOrder) < 0){
              results.push(data[i].sortOrder);
            }
        }
        

        results 变量将包含您想要的列表。

        【讨论】:

        • .length === 0 不需要特殊情况,indexOf 仍然会给出-1
        • 是的。不知道我在写第一部分时在想什么。编辑删除。
        【解决方案6】:

        许多简单的 JS 产品,与库相比总是很好。考虑使用 ES5 的 reduce:

        var result = data.reduce(function(acc, val) {
          if (acc.indexOf(val.sortOrder) == -1) acc.push(val.sortOrder);
          return acc;
        },[]);
        

        【讨论】:

          【解决方案7】:

          我觉得我会使用Set 来确保sortOrder 保持单条目。如果这是您需要的数据结构,您可以使用扩展运算符将其放回数组中。您不必编写新函数或大量逻辑来检查条目是否以这种方式存在,但如果需要大量重用,您可以将整个内容包装在一个函数中。

          const result = [...new Set(data.map(({ sortOrder }) => sortOrder))];
          

          或者作为一个函数:

          const getAllSortOrders = (data) => [...new Set(data.map(({ sortOrder }) => sortOrder))];
          

          【讨论】:

            猜你喜欢
            • 2021-01-09
            • 1970-01-01
            • 1970-01-01
            • 2021-03-03
            • 2020-08-03
            • 2013-08-24
            • 1970-01-01
            • 2018-11-07
            • 1970-01-01
            相关资源
            最近更新 更多