我试图将两个数组合并为一个对象数组,而我正在与之斗争。
示例:
arr1 = [a,b,c];
arr2 = [a,a,a,b,b,c,d,d];
我希望将这两者结合起来的方式:
combinedArr = [
{name: a, amount: 3},
{name: b, amount: 2},
{name: c, amount: 1}
];
请注意,只应集成存储在arr1中的值,arr1中不存在的任何arr2值都会被省略。 (在这个例子中,它是" d")
同样重要的是要知道我将这个用于After Effects的Extendscript,这限制了我对ECMA-262标准的第3版,给我留下了很好的旧经典javascript。无法使用concat,slice和join等功能。
我已经尝试过了,但我无法解决这个问题。我确信它可以通过数组实现只有两到三个智能循环的解决方案。
提前致谢, 西蒙
编辑: 我没有在我的问题上添加自己的尝试,从而造成了混乱。对不起,我没有,我一夜之间都在考虑这件事,并在火车上的电话上写下了这个问题。
我已经收到了我非常高兴的惊人答案,只是为了证明我对我的问题没有任何不良意义,我会发布我之前写过的内容(不是简化的,但是来自实际代码):
var createMarkerList = function() {
var subList = _createMarkerListSub(); //in this example arr1
var masterList = _createMarkerListMaster(); //in this example arr2
var output = [];
for(var i=0;i<subList.length;i++){
var uniqueMarker = subList[i];
output.push({
name: uniqueMarker,
amount: 0,
});
}
for(var i=0;i<masterList.length;i++){
var genericMarker = masterList[i];
if(output[i].name == genericMarker){
output[i].amount = output[i].amount +1;
}
}
}
请注意,我并没有试图找到答案而没有试图解决问题,所以我没有尝试轻松解决问题,因为某种原因,我根本无法解决问题。&lt; < / p>
答案 0 :(得分:2)
你将不得不迭代两个数组并保持arr1中所有元素的计数。
var arr1 = ['a','b','c'];
var arr2 = ['a','a','a','b','b','c','d','d'];
var combinedObject= {}, combinedArray = [];
for(var i=0; i<arr1.length; i++)
combinedObject[arr1[i]] = 0;
for(var i=0; i<arr2.length; i++)
if(combinedObject.hasOwnProperty(arr2[i]))
combinedObject[arr2[i]]++;
for(var key in combinedObject)
combinedArray.push({'name': key, 'amount':combinedObject[key]});
console.log(combinedArray);
&#13;
答案 1 :(得分:1)
您可以使用哈希表并将其用于计数。
您需要循环遍历arr1
创建哈希表和结果集,并在项目上第二个循环来计算和增加amount
属性。
var arr1 = ['a', 'b', 'c'],
arr2 = ['a', 'a', 'a', 'b', 'b', 'c', 'd', 'd'],
hash = {},
result = [],
i;
for (i = 0; i < arr1.length; i++) {
hash[arr1[i]] = { name: arr1[i], amount: 0 };
result.push(hash[arr1[i]]);
}
for (i = 0; i < arr2.length; i++) {
hash[arr2[i]] && hash[arr2[i]].amount++;
}
console.log(result);
&#13;