Javascript - 动态构建条件

时间:2017-04-21 18:29:40

标签: javascript

我创建了一个名为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);




2 个答案:

答案 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;
  });
}