我有从中想要取出特定字段的对象列表,但我也想删除重复项。我写了一些代码片段,但我想让它更简洁。我有一个限制,我的项目使用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']
答案 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
而不是forEach
和filter
的组合。
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;
答案 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);
}