2016-02-26 116 views
0

我有以下幾點:如何在Javascript中合併和過濾兩個對象數組?

var owners = [{ 
    "ownerid": "11", 
    "name": "jane", 
    "sex": "female" 
}, { 
    "ownerid": "22", 
    "name": "mike", 
    "sex": "male" 
}, { 
    "ownerid": "33", 
    "name": "alex", 
    "sex": "male" 
}]; 

var cars = [{ 
    "ownerid": "11", 
    "make": "ford", 
    "model": "mustang" 
}, { 
    "ownerid": "11", 
    "make": "honda", 
    "model": "civic" 
}, { 
    "ownerid": "33", 
    "make": "toyota", 
    "model": "corolla" 
}]; 

而且我想這個

var mergedandfiltered = [{ 
    "name": "jane", 
    "sex": "female", 
    "make": "ford", 
    "model": "mustang" 
}, { 
    "name": "jane", 
    "sex": "female", 
    "make": "honda", 
    "model": "civic" 
}, { 
    "name": "alex", 
    "sex": "male", 
    "make": "toyota", 
    "model": "corolla" 
}]; 

這個想法最終是要有一個結果合併,過濾,所以我有所有者,所有者屬性的列表以及他們擁有的汽車和汽車物業。邁克不擁有任何汽車,因此不會在結果中顯示。 「ownerid」是常用鏈接,但我不需要在結果中顯示。

純JS解決方案首選請!

+6

歡迎來到Stack Overflow!請[參觀],環顧四周,並通讀[幫助],特別是[*我如何提出一個好問題?](/幫助/如何問)和[*什麼類型的我應該避免提問?*](/ help/dont-ask)你卡在哪裏?在SO上的文化是,你至少應該嘗試一下,然後如果遇到這樣的問題,請展示嘗試並描述問題。 –

+0

基本上,你需要做的就是循環'cars'並在所有者中找到與'ownerid'匹配的條目,然後構建新的對象。看看[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)以及陣列的所有可用函數,你應該可以做到這一點。由於您將一個數組(「汽車」)映射到一個新數組,所以'map'函數可能是一個很好的開始。然後再看'find'查找'owners'中的元素。將所有者轉換爲以id爲單位的字典可能更有效。 –

回答

2

首先建立參考業主的對象,然後遍歷汽車,並結合新的對象。

var owners = [{ "ownerid": "11", "name": "jane", "sex": "female" }, { "ownerid": "22", "name": "mike", "sex": "male" }, { "ownerid": "33", "name": "alex", "sex": "male" }], 
 
    cars = [{ "ownerid": "11", "make": "ford", "model": "mustang" }, { "ownerid": "11", "make": "honda", "model": "civic" }, { "ownerid": "33", "make": "toyota", "model": "corolla" }], 
 
    obj = {}, 
 
    result; 
 

 
owners.forEach(function (a) { 
 
    obj[a.ownerid] = a; 
 
}); 
 

 
result = cars.map(function (a) { 
 
    return { 
 
     name: obj[a.ownerid].name, 
 
     sex: obj[a.ownerid].sex, 
 
     make: a.make, 
 
     model: a.model 
 
    }; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

1
var owners = [{"ownerid":"11", "name":"jane", "sex":"female"}, {"ownerid":"22", "name":"mike", "sex":"male"}, {"ownerid":"33", "name":"alex", "sex":"male"}]; 

var cars = [{"ownerid":"11", "make":"ford", "model":"mustang"}, {"ownerid":"11", "make":"honda", "model":"civic"}, {"ownerid":"33", "make":"toyota", "model":"corolla"} ]; 

var mergedandfiltered = []; 
for(var i = 0; i < owners.length; i++){ 
    for(var j = 0; j < cars.length; j++){ 
    if(owners[i]['ownerid'] == cars[j]['ownerid']){ 
     mergedandfiltered.push({"name":owners[i]['name'],"sex":owners[i]['sex'],"make":cars[j]['make'],"model":cars[j]['model']}); 
    }   
    } 
} 
+0

我不認爲這是最好的方法:你將擁有owners.length * cars.length迭代。例如:如果所有者擁有20件物品和汽車,則代碼將重複440次。 –

0
var mergedandfiltered = []; 
for (var i = 0; i < owners.length; i++) { 
    var oID = owners[i].ownerid; 
    for (var j = 0; j < cars.length; j++) { 
     var mitem = {}; 
     cID = cars[j].ownerid; 
     if (oID==cID) { 
     mitem.name = owners[i].name; 
     mitem.sex = owners[i].sex; 
     mitem.make = cars[j].make; 
     mitem.model = cars[j].model; 
     mergedandfiltered.push(mitem); 
     } 
    } 
} 
0

您可以將您的業主陣列成「哈希」(使用所有者爲重點),然後即可根據汽車的陣列OWNERID它們的屬性。

var hashowners = []; 
owners.forEach(function(o) { 
    hashowners[o.ownerid] = {"name": o.name, "sex": o.sex}; 
}); 

var finalcars = cars.map(function(car) { 
    car.name = hashowners[car.ownerid].name; 
    car.sex = hashowners[car.ownerid].sex; 
    delete car.ownerid; 
    return car; 
}); 

console.log(finalcars) 

小提琴:https://jsfiddle.net/61fb13n8/

0
var owners = [ { 
     "ownerid" : "11", 
    "name" : "jane", 
    "sex" : "female" 
}, { 
    "ownerid" : "22", 
    "name" : "mike", 
    "sex" : "male" 
}, { 
    "ownerid" : "33", 
    "name" : "alex", 
    "sex" : "male" 
} ]; 

var cars = [ { 
    "ownerid" : "11", 
    "make" : "ford", 
    "model" : "mustang" 
}, { 
    "ownerid" : "11", 
    "make" : "honda", 
    "model" : "civic" 
}, { 
    "ownerid" : "33", 
    "make" : "toyota", 
    "model" : "corolla" 
} ]; 

var merge = function(array, array2, filter) { 
    var result = []; 
    for (var i in array) { 
     for (var j in array2) { 
      var filtered = filter(array[i],array2[j]); 
      if (filtered != null){ 
       result.push(filtered); 
      } 

     } 
    } 
    return result; 
}; 
var result = merge(owners,cars,function(owner,car){ 
    if (owner.ownerid == car.ownerid){ 
     return { 
      name : owner.name, 
      model : car.model 
     }; 
    } 
    return null; 
}); 
console.log('array',result); 
1

爲了提高效率,我們開始通過將我們的用戶列表插入使用所有者的關鍵一本字典。我們可以用Array.protoype.reduce做到這一點:

var ownerDict = owners.reduce(function(p, c) { 
    p[c.ownerid] = c; 
    return p; 
}, {}); 

這會給你一個對象,它看起來像這樣:

{ 
    "11": { 
     "ownerid": "11", 
     "name": "jane", 
     "sex": "female" 
    }, 
    "22": { 
     "ownerid": "22", 
     "name": "mike", 
     "sex": "male" 
    }, 
    "33": { 
     "ownerid": "33", 
     "name": "alex", 
     "sex": "male" 
    } 
} 

我們這樣做是因爲現在我們可以看一下用戶的原因,例如:

var owner = ownerDict[11]; 

,這會給你回對象:

{ 
    "ownerid": "11", 
    "name": "jane", 
    "sex": "female" 
} 

而這種查找是O(1)。如果您必須真正搜索數組才能找到它(假設它尚未排序),那麼您的搜索將是O(n)(如果它是排序的,您示例數據實際上看起來只是稍微好一點 - 您可以使用樹搜索是O(log(n)),但仍比O(1)慢,代碼更復雜)

現在用的是字典,現在我們可以只使用Array.prototype.map我們cars數組轉換成你想要這樣的東西:

var mergedandfiltered = cars.map(function(c) { 
    var owner = ownerDict[c.ownerid]; 
    return { 
    name: owner.name, 
    sex: owner.sex, 
    make: c.make, 
    model: c.model 
    }; 
}); 
相關問題