2015-11-25 86 views
0

我有一個數組如下結合陣列條件在javascript

arr1 = [{ 
    'Name': 'Ken', 
    'ProjectId': '123' 
}, { 
    'Name': 'Kris', 
    'ProjectId': '223' 
}, { 
    'Name': 'Ken', 
    'ProjectId': '223' 
}, { 
    'Name': 'Ben', 
    'ProjectId': '229' 
}, { 
    'Name': 'Alex', 
    'ProjectId': '222' 
}, { 
    'Name': 'Kris', 
    'ProjectId': '786' 
}] 

欲得到的陣列,其中基於名稱從陣列重複被刪除,但如果專案編號= 123保持在陣列並刪除其他重複

即,在上面的例子中有2個重複與名稱肯但一個記錄具有專案編號= 123,在這種情況下,考慮該記錄和刪除其它類似的名稱重複

此外,如果重複的不包含專案編號爲123 REM任何一個重複。 例如:在上面的例子中,有兩個名稱爲Kris的重複項目,但沒有將123作爲該案例中的任何一個。

即我的結果數組應該是這樣的

[{ 
    'Name': 'Ken', 
    'ProjectId': '123' 
}, { 
    'Name': 'Kris', 
    'ProjectId': '223' 
}, { 
    'Name': 'Ben', 
    'ProjectId': '229' 
}, { 
    'Name': 'Alex', 
    'ProjectId': '222' 
}] 

[{ 
    'Name': 'Ken', 
    'ProjectId': '123' 
}, { 
    'Name': 'Ben', 
    'ProjectId': '229' 
}, { 
    'Name': 'Alex', 
    'ProjectId': '222' 
}, { 
    'Name': 'Kris', 
    'ProjectId': '786' 
}] 
+1

什麼的該具體方面,你有困難? – StriplingWarrior

+0

使用字典記錄之前已經檢查過的名稱。如果名稱存在&id!= 123,則跳過。 –

+1

如果有重複項而且沒有123的ID,該怎麼辦?您需要更具體,並且您還需要發佈代碼並解釋發生了什麼問題(任何錯誤等),以便我們幫助解決問題。 – Archer

回答

-1

工作液:

var arr1 = [{ 
    'Name': 'Ken', 
    'ProjectId': '123' 
}, { 
    'Name': 'Kris', 
    'ProjectId': '223' 
}, { 
    'Name': 'Ken', 
    'ProjectId': '223' 
}, { 
    'Name': 'Ben', 
    'ProjectId': '229' 
}, { 
    'Name': 'Alex', 
    'ProjectId': '222' 
}, { 
    'Name': 'Kris', 
    'ProjectId': '786' 
}]; 

function filter(arr) { 

    var i, j; 

    for (i = 0; i < arr.length; i++) { 
     for (j = i; j < arr.length; j++) { 
      if (i === j) { continue; } 
      if (arr[j].Name === arr[i].Name) { 
       var spliceIndex = (arr[j].ProjectId === '123') ? i : j; 

       arr.splice(spliceIndex, 1); 
       j--; 

       if (spliceIndex === i) { 
        i--; 
        break; 
       } 
      } 
     } 
    } 

    return arr; 
} 

console.log(filter(arr1)); 
+0

感謝雷克斯,它像一個魅力! – Techy

-2

使用lodash的uniq功能。傳入自定義比較器。示例代碼從他們的文檔:

// using an iteratee function 
_.uniq([1, 2.5, 1.5, 2], function(n) { 
    return this.floor(n); 
}, Math); 
// → [1, 2.5] 

或者摘去速記:

// using the `_.property` callback shorthand 
_.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); 

我相信underscore.js具有相同的功能。

+0

@安迪嗯猜我實際上不明白這個問題。 ¯\\ _(ツ)_ /¯ – djechlin

-1

這是一個解決方案。您可以過濾輸入數組,並搜索當前元素位置是否與輸入數組中的第一個結果相同以消除重複項。

var arr1 = [{ 
 
    'Name': 'Ken', 
 
    'ProjectId': '123' 
 
}, { 
 
    'Name': 'Kris', 
 
    'ProjectId': '223' 
 
}, { 
 
    'Name': 'Ken', 
 
    'ProjectId': '223' 
 
}, { 
 
    'Name': 'Ben', 
 
    'ProjectId': '229' 
 
}, { 
 
    'Name': 'Alex', 
 
    'ProjectId': '222' 
 
}, { 
 
    'Name': 'Kris', 
 
    'ProjectId': '786' 
 
}]; 
 

 
var result=arr1.filter(function(e,i,a){ 
 
    if (a.map(function(d) { return d['Name']; }).indexOf(e.Name) == i) { 
 
    return e; 
 
    } 
 
}) 
 

 
console.log(result);

0
function removeDuplicatesByName(arr) { 
    var obj = {}; 
    for(var i = 0; i < arr.length; i++) { 
     obj[arr[i].Name] = arr[i]; 
    } 
    var out = []; 
    for(var key in obj) 
     out.push(obj[key]); 
    out.sort(function(a, b){ return a.ProjectId - b.ProjectId; }); 
    return out; 
} 

它使用的事實,對象不能有重複鍵的名字刪除您的陣列中的所有副本。它返回它們按ProjectId排序,因爲排序在進入對象時會丟失。

0

JSFIDDLE DEMO

這應該有效。 :)

var arr1 = [{ 
    'Name': 'Ken', 
    'ProjectId': '123' 
}, { 
    'Name': 'Kris', 
    'ProjectId': '223' 
}, { 
    'Name': 'Ken', 
    'ProjectId': '223' 
}, { 
    'Name': 'Ben', 
    'ProjectId': '229' 
}, { 
    'Name': 'Alex', 
    'ProjectId': '222' 
}, { 
    'Name': 'Kris', 
    'ProjectId': '786' 
}]; 

var removeDups = function (array) { 
    for (var i=0; i < array.length; i++) { 
     var obj1 = array[i]; 
     for (var j=0; j < array.length; j++) { 
      if (j==i) 
       continue; 
      var obj2 = array[j]; 

      if (obj1.Name == obj2.Name) { 
       var indexToDelete = checkProject123(i, j); 
       array.splice(indexToDelete-1, indexToDelete); 
      } 
     } 
    } 

    return array; 
} 

var checkProject123 = function (i, j) { 
    if (arr1[i].ProjectId == '123') 
     return j; // Index i has projectId 123 so return j to be deleted. 
    else if (arr1[j].ProjectId == '123') 
     return i; // Index j has projectId 123 so return i to be deleted. 
    else 
     return i; // Neither of them have projectId 123 so delete the first one, idk 
} 

console.log(removeDups(arr1));