在Node JS

时间:2017-11-03 01:03:13

标签: javascript node.js

我有从中想要取出特定字段的对象列表,但我也想删除重复项。我写了一些代码片段,但我想让它更简洁。我有一个限制,我的项目使用ES5。所以,请相应地建议。

var type = [];
obj.forEach(function(o) {
    if(o.type && o.type !== 'null')
        type.push(o.type);
});

return type.filter(function filterDuplicates(elem, pos) {
    return type.indexOf(elem) === pos;
});

请建议更好的方法来做到这一点。输入obj将如下所示: -

  

[       {           'type':'string'       },       {           'type':'string'       },       {           'type':'整数'       }       ]

结果应为['string','integer']

3 个答案:

答案 0 :(得分:1)

您可以使用#include <chrono> #include <type_traits> template <typename> struct is_chrono_duration : std::false_type { }; template <typename R, typename P> struct is_chrono_duration<std::chrono::duration<R, P>> : std::true_type { }; template <typename T, bool = is_chrono_duration<T>::value> class TmpAlrD; template <typename T> class TmpAlrD<T, true> { public: explicit TmpAlrD(T delay = T{}) : mDelay(delay) { } private: T mDelay; std::chrono::steady_clock::time_point mTriggerTime; }; int main () { TmpAlrD<std::chrono::nanoseconds> nsDelay; // compile TmpAlrD<std::chrono::milliseconds> msDelay; // compile TmpAlrD<std::chrono::seconds> sDelay; // compile //TemporalAlarmDelay<int> // compilation error } 来避免添加重复项。 type.indexOf查找值并在找到时返回其索引,否则返回-1。

indexOf

答案 1 :(得分:0)

这有点短(不是很多),但只需要使用一种方法reduce而不是forEachfilter的组合。

&#13;
&#13;
var obj = [{ 'type': 'string' }, { 'type': 'string' }, { 'type': 'integer' }];

var result = obj.reduce(function(p, o) {
  if (!o || !o.type || p.indexOf(o.type) !== -1) return p;
  p.push(o.type)
  return p
}, [])

console.log(result)
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我经常喜欢使用对象属性来删除重复项,尤其是对于长列表。如果您有一个短名单,使用indexOf就可以了。但是,如果您有一个很长的列表,这会变得更有效率。实质上,下面的“类型”仅用于将类型名称存储为属性。将其设置为true只是为了给它一个值。无论您分配给它的是什么 - 您最关心的是最后的属性名称。

var input = [ { 'type': 'string' }, { 'type': 'string' }, { 'type': 'integer' } ];
var types = {};
var result = [];

input.forEach(function (obj) {
    if (o.type) {
        types[o.type] = true;
    }
});
for (var t in types) {
    result.push(t);
}