2017-03-16 65 views
3

對不起,如果json不是完美的,我試圖將它輸入到Stackoverflow窗口中......無論如何,你可以從下面看到我想把所有單獨的對象在數組中並將它們合併到具有匹配url的第一個數組中。一旦它們合併,其他所有其他需要從陣列中刪除。通過匹配相同的鍵值來合併數組中的對象

var myArray = [ 
{ 
id: '123', 
url: 'http://foo.com/1.jpg', 
size: 7, 
qty: 1 
}, 
{ 
id: '345', 
url: 'http://foo.com/5.jpg', 
color: 'blue', 
qty: 5 
}, 
{ 
id: '678', 
url: 'http://foo.com/1.jpg', 
size: 8, 
qty: 4 
}]; 

我需要讓這個數組變成... 下面你可以看到,現在已經匹配URL的對象已經移到第一個匹配對象的變化'的關鍵。之後他們不再分開。它們基本上都匹配在一起併合併到同一個對象中。

var myArray = [{ 
id: '123', 
url: 'http://foo.com/1.jpg', 
variations:[ 
    { 
     id : '123' 
     size : 7, 
     qty: 1 
    }, 
    { 
     id : '678' 
     size : 8, 
     qty: 4 
    }], 
{ 
id: '345', 
url: 'http://foo.com/5.jpg', 
color: 'blue', 
qty: 5 
}]; 

到目前爲止,我有這樣的事情:但這只是工作正在進行中。遇到麻煩帶到終點線。

myArray.forEach(function(product, index){ 
    var sizeVariations = []; 
    var currentSearch = product.url; 
    var filteredArray = processedProducts.filter(function(obj) { 
    return obj.primary_image === currentSearch; 
    }); 

    if(filteredArray){ 
    filteredArray.forEach(function(data, index){ 
     sizeVariations.push({ 
     id : data.id, 
     size : data.size, 
     quantity : data.qty 
     }); 
    }); 
    } 
}); 
+1

你嘗試過什麼?你有什麼需要幫助的?請參閱[*如何創建最小,完整和可驗證的示例*](http://stackoverflow.com/help/mcve)。 – RobG

+0

我真的不會建議創建這樣一個零碎的數據結構(即一些條目與'變體'和一些沒有)。另外,你如何確定'id'是否存在於合併條目的變體之外? – Phil

+0

基本上,如果他們有匹配的url值,那麼我需要所有的信息都在同一個對象中 – jremi

回答

1

你可以做一些類似的;因爲它看起來像數據的重複,所以我沒有將ID保持在頂層。

var myArray = [ 
 
{ 
 
id: '123', 
 
url: 'http://foo.com/1.jpg', 
 
size: 7, 
 
qty: 1 
 
}, 
 
{ 
 
id: '345', 
 
url: 'http://foo.com/5.jpg', 
 
color: 'blue', 
 
qty: 5 
 
}, 
 
{ 
 
id: '678', 
 
url: 'http://foo.com/1.jpg', 
 
size: 8, 
 
qty: 4 
 
}]; 
 

 
function mergeObjects(arr) 
 
{ 
 
    var resultArray = []; 
 
    var urls = []; 
 
    for(var item in arr) 
 
    { 
 
    var itemIndex = urls.indexOf(arr[item].url); 
 
    if(itemIndex == -1) 
 
    { 
 
     urls.push(arr[item].url); 
 
     var obj = {}; 
 
     obj.url = arr[item].url; 
 
     obj.variations = []; 
 
     var variationData = {}; 
 
     variationData.id = arr[item].id; 
 
     if(arr[item].size !== undefined) 
 
     { 
 
     variationData.size = arr[item].size; 
 
     } 
 
     if(arr[item].qty !== undefined) 
 
     { 
 
     variationData.qty = arr[item].qty; 
 
     } 
 
     if(arr[item].color !== undefined) 
 
     { 
 
     variationData.color = arr[item].color; 
 
     } 
 
     
 
     obj.variations.push(variationData); 
 
     resultArray.push(obj); 
 
    } 
 
    else 
 
    { 
 
     var variationData = {}; 
 
     variationData.id = arr[item].id; 
 
     if(arr[item].size !== undefined) 
 
     { 
 
     variationData.size = arr[item].size; 
 
     } 
 
     if(arr[item].qty !== undefined) 
 
     { 
 
     variationData.qty = arr[item].qty; 
 
     } 
 
     if(arr[item].color !== undefined) 
 
     { 
 
     variationData.color = arr[item].color; 
 
     } 
 
     resultArray[itemIndex].variations.push(variationData) 
 
    } 
 
    
 
    } 
 
    return resultArray; 
 
} 
 

 
console.log(mergeObjects(myArray));

+1

這正是我所需要的。我已經在修改它以適應我的需求。 Thx – jremi

+1

這兩個短語看起來像是對我的矛盾:P – trincot

0

我想你可以嘗試收集所有URL對象中的第一個,這樣就可以保證唯一性,然後將其轉換爲一個數組,這樣的事情,

function Merge(arr) { 
    var obj = {}; 

    for (var elem of arr) { 
     if (obj[elem.url] == undefined) { 
      obj[elem.url] = { 
       id: elem.id, 
       variations: [], 
       url: elem.url 
      }; 
     } 

     obj[elem.url].variations.push(elem); 
     delete elem.url; 
    } 

    var ans = []; 
    for (var elem in obj) { 
     var tmp = { 
      id: obj[elem].id, 
      url: elem 
     }; 
     if(obj[elem].variations.length > 1) 
      tmp.variations = obj[elem].variations; 
     else { 
      tmp.color = obj[elem].variations[0].color; 
      tmp.qty = obj[elem].variations[0].qty; 
     } 
     ans.push(tmp); 
    } 

    return ans; 
} 
0

我覺得自己像一個更好的數據結構將被url鎖定。

const myArray = [{"id":"123","url":"http://foo.com/1.jpg","size":7,"qty":1},{"id":"345","url":"http://foo.com/5.jpg","color":"blue","qty":5},{"id":"678","url":"http://foo.com/1.jpg","size":8,"qty":4}] 
 

 
const urlMap = myArray.reduce((byUrl, entry) => { 
 
    const entryWithoutUrl = Object.assign({}, entry) 
 
    delete entryWithoutUrl.url 
 

 
    if (Array.isArray(byUrl[entry.url])) { 
 
    byUrl[entry.url].push(entryWithoutUrl) 
 
    } else { 
 
    byUrl[entry.url] = [entryWithoutUrl] 
 
    } 
 
    return byUrl 
 
}, Object.create(null)) 
 

 
const newArray = Object.keys(urlMap).map(url => ({ 
 
    url: url, 
 
    variations: urlMap[url] 
 
})) 
 

 
console.info(newArray)

0

在這個例子中,我已經下破的問題分爲兩個小問題,因沒有通過數組迭代來檢查網址已經存在,那麼一旦一切都按分組的效率我們將結果對象轉換回數組,每個鍵作爲數組中的一個項目。

,如果你使用的函數式編程,你可以組合這些功能結合在一起

compose(objectToArray, sortByUnique)('url', myArray) 

var myArray = [ 
 
    { id: '123', url: 'http://foo.com/1.jpg', qty: 1, size: 7 }, 
 
    { id: '345', url: 'http://foo.com/5.jpg', qty: 5, color: 'blue' }, 
 
    { id: '678', url: 'http://foo.com/1.jpg', qty: 4, size: 8 }, 
 
    { id: '69', url: 'http://foo.com/1.jpg', qty: 4, size: 8 } 
 
] 
 

 
function sortByUnique(unique, array) { 
 
    // group array by unique key into an object 
 
    return array.reduce((acc, x) => { 
 
    let key = x[unique] 
 
    delete x[unique] 
 
    if (acc[key]) { 
 
     if (!acc[key].variations) { 
 
     let old = acc[key] 
 
     acc[key] = { 
 
      variations: [old, x] 
 
     } 
 
     } 
 
     else { 
 
     acc[key].variations.push(x) 
 
     } 
 
    } 
 
    else { 
 
     acc[key] = x 
 
    } 
 
    return acc 
 
    }, {}) 
 
} 
 

 
function objectToArray(obj) { 
 
    return Object.keys(obj).map(
 
    k => Object.assign(
 
     { url: k }, 
 
     obj[k] 
 
    )) 
 
} 
 

 
console.log(
 
    objectToArray(sortByUnique('url', myArray)) 
 
)

+0

如果url被分組到數組中,會發生什麼......? url:['http://foo.com/1.jpg'] } – jremi

+0

那不在示例中,所以它會打破上面的代碼。 – synthet1c

+0

是的,我知道,我很抱歉,但我想知道你是否可以證明它如何與數組一起工作。 – jremi

相關問題