0

所以我有具有主叫xprod與(輸入,輸入),類似於如下的要求一些代碼:通過比較元素從列表中過濾出元組是否有無點的方法?

const input = [ 
    { id: 1, data: 'a' }, 
    { id: 2, data: 'b' }, 
]; 
const product = xprod(input, input); 
/* 
    [ 
    [ { id: 1, data: 'a' }, { id: 1, data: 'a' } ], 
    [ { id: 1, data: 'a' }, { id: 2, data: 'b' } ], 
    [ { id: 2, data: 'b' }, { id: 1, data: 'a' } ], 
    [ { id: 2, data: 'b' }, { id: 2, data: 'b' } ], 
    ] 
*/ 

我要過濾列表中的元組通過上述的第一個元素進行比較元組到第二個元素在同一個元組中。在這種情況下,爲了移除包含具有相同ID的對象的元組(因此第0和第3個元素應該被過濾出來 - 我知道在這個簡化的例子中,我可以使用嚴格的等式來過濾,但通常情況並非如此在我實際寫的代碼中)。

我知道我可以用lambdas簡單地完成這個任務,但是由於我發現自己最終會使用這種數據(元組列表),所以在使用ramda時經常會遇到這種情況,以無關點的方式將元組元素添加到同一元組中的另一個項目。也許這只是保持簡單並使用lambda的一個參數,但我很好奇,如果有不同的方式來做到這一點。

Here's a link to a ramda repl包含一個實現。

+2

假設列表中沒有重複項,不能使用'xprod'而不是跳過對角線嗎? – Bergi

+0

@Bergi可能 - 在我目前的情況下,除了對角線之外不會有任何重複。不過,我正在使用ramda提供的xprod。我當然可以寫我自己的。這可能是最快的方法,考慮到我可以跳過'filter'所需的以下迭代。 – dvlsg

回答

4

一種選擇是簡單地包裝一個函數,該函數需要使用R.apply的元組的兩個參數。在你的例子中,可能是部分應用R.eqProps

R.filter(R.apply(R.eqProps('id')), product)