我创建了一个名为function
的常规unique()
来删除特定数组中的重复项。
但是我遇到了问题:我希望根据传递给function
的属性动态构建条件。
Ex :假设我想要传递2个属性,所以我想在"删除"之前检查这两个属性。那个重复的对象。
目前我使用eval()来构建此条件"&&",但根据我的搜索,这真的是一种不好的做法。
所以,我的问题是:
做这种事的正确方法是什么?
以下是我目前的代码:
function unique(arr, ...props) {
const conditions = [];
for (let prop of props) {
conditions.push(`element['${prop}'] === elem['${prop}']`);
}
const condStr = conditions.join(' && ');
return arr.filter((element, index) => {
const idx = arr.findIndex((elem) => {
return eval(condStr);
});
return idx === index;
});
}
const arr1 = [{
id: 1,
name: 'Josh',
description: 'A description'
}, {
id: 2,
name: 'Hannah',
description: 'A description#2'
}, {
id: 1,
name: 'Josh',
description: 'A description#3'
}, {
id: 5,
name: 'Anyname',
description: 'A description#4'
}];
const uniqueValues = unique(arr1, 'id', 'name');
console.log('uniqueValues', uniqueValues);

答案 0 :(得分:2)
就实现细节而言,这个问题有点主观,但如果你问我,更好的方法是传递一个回调函数来交给过滤。
通过这种方式,你可以根据自己的需要编写功能。如果您有一组复杂的条件,则可以使用合成在函数中构建条件,然后再将其传递给您的唯一函数https://hackernoon.com/javascript-functional-composition-for-every-day-use-22421ef65a10
功能组合的关键是具有可组合的功能。可组合函数应该有1个输入参数和1个输出值。
hackernoon文章相当不错,深入探讨。
这将返回一个应用所有前提条件的函数
function unique(arr, callback) {
return arr.filter(callback);
}
const compose = (...functions) => data =>
functions.reduceRight((value, func) => func(value), data)
unique(
[1, 3, 4, 5 ,7, 11, 19teen]
compose(
(someStateCondition) => { /** return true or false **/ },
(result) => { /** return result === someOtherStateCondition **/}
)
)
答案 1 :(得分:1)
使用Array#every
比较所有内联属性:
function unique(arr, ...props) {
return arr.filter((element, index) => {
const idx = arr.findIndex(
elem => props.every(prop => element[prop] === elem[prop]);
);
return idx === index;
});
}