2017-08-15 51 views
0

我試圖迭代具有不同屬性的對象數組。我正在動態添加對象,並且想要檢查對象的屬性是否存在於數組中,然後只覆蓋該值,否則將其添加到數組中。從具有唯一值的對象數組中過濾唯一屬性(如果存在),則覆蓋該值

對於e.x.

var arr = [ 
      {"value":"abc"}, 
      {"type":"def"}, 
      {"status":"ghi"}, 
      {"value":"xyz"} 
      ] 

預期的結果:

arr = [ 
      {"value":"xyz"}, 
      {"type":"def"}, 
      {"status":"ghi"} 

]

我試圖至今沒有工作。這裏是我的代碼:

var arr = [ 
      {"value":"abc"}, 
      {"type":"def"}, 
      {"status":"ghi"}, 
      {"value":"abc"} 
      ] 
      var obj={}; 
      var key1 = "type", value="xyz"; 
      obj[key1] = value; 
      var newarr = arr.filter(function(entry,i) { 
       if (!entry.hasOwnProperty(key1)) { 
        return true; 
       } 
      }); 
      newarr.push(obj); 

請注意,與obj將是動態的,所以我的代碼工作正常進行第一次當KEY1的屬性不會改變。一旦我將key1的值從「type」更改爲「status」,它將添加對象2次。

有人能幫我解決這個問題嗎?

+0

更換type如何'type'變異到'數據類型'?還是兩個不同? –

+0

錯字更正! –

+0

這兩個'value'鍵和更新會發生什麼? –

回答

3

試試這個Array.reduce()功能和Object.keys()方法。

  1. array#reduce()使用具有新的數組
  2. Object.keys()重新獲得每個對象的密鑰。 Array#map()創建所有對象鍵的數組。
  3. 接着匹配如果不includes的數組,然後用新陣推

更新與新value

var arr = [{"value":"abc"}, {"type":"def"}, {"status":"ghi"}, {"value":"xyz"}]; 
 
    var key1 = "type"; 
 
    var value="xyz"; 
 
      
 
    var result = arr.reduce((a,b) =>{ 
 
    if(!a.map(i=> Object.keys(i)[0]).includes(Object.keys(b)[0])) 
 
    { 
 
    if(b.hasOwnProperty(key1)){ 
 
     b[key1]=value 
 
    } 
 
    a.push(b) 
 
    } 
 
    return a}, []); 
 
     
 
    
 
console.log(result);

+0

謝謝你回答先生。我們可以使用過濾器嗎? –

+0

過濾器沒有做同樣的工作...'reduce()'有什麼問題? – prasanth

+0

減少沒有問題只是想知道我們可以通過過濾器/最短的方式來實現同樣的事情,這似乎是通過減少。 –

0

您可以使用散列表並過濾並更新所有找到的相同鍵對象。

var array = [{ value: "abc" }, { type: "def" }, { status: "ghi" }, { value: "ddd" }], 
 
    key = "type", 
 
    value = "xyz", 
 
    update = false, 
 
    hash = Object.create(null), 
 
    temp = {}; 
 

 
temp[key] = value; 
 

 
array.push(temp); 
 
array = array.filter(function (o) { 
 
    var key = Object.keys(o)[0]; 
 
    if (!hash[key]) { 
 
     hash[key] = o; 
 
     return true; 
 
    } 
 
    hash[key][key] = o[key]; 
 
}); 
 

 
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

使用ES6 Array.prototype.reduce()Object.assign()功能的解決方案:

var arr = [{"value":"abc"}, {"type":"def"}, {"status":"ghi"}, {"value":"xyz"}], 
 
    obj = arr.reduce((r,o) => Object.assign(r,o), {}), 
 
    result = Object.keys(obj).map((k) => { o = {}; o[k]=obj[k]; return o }); 
 
    
 
console.log(result);

+0

@DipeshRaichana,對於對象數組 - 固定的,對於舊值 - 並非如此,它會按預期給出更新值。檢查我的更新 – RomanPerekhrest

+0

我已經得到了答案。無論如何..感謝您的回答! –

0

下面的代碼應該做的工作:

var arr = [ 
 
    {"value":"abc"}, 
 
    {"type":"def"}, 
 
    {"status":"ghi"}, 
 
    {"value":"xyz"} 
 
]; 
 

 
var obj = {}; 
 
for (i in arr) { 
 
    key = Object.keys(arr[i])[0]; 
 
    obj[key] = arr[i][key]; 
 
} 
 

 
console.log(obj);