【问题标题】:Combine two arrays into Array of objects, counting up duplicates将两个数组组合成对象数组,计算重复项
【发布时间】:2017-09-25 06:49:55
【问题描述】:

我正在尝试将两个数组组合成一个对象数组,但我正在为此苦苦挣扎。

例子:

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;
        }
    }
}

请注意,我并没有试图通过简单地询问您的答案而不试图弄清楚,我只是出于某种原因无法理解它。

【问题讨论】:

  • 你有没有尝试过?
  • 我同意 Rajesh 的观点,这只是一些基础知识,我建议先阅读 javascript 教程
  • @Simon,记住分享你的努力非常重要。它可以是代码/算法/搜索链接。除非你分享它,否则你的问题看起来像是一个要求,而不是一个问题陈述。这可能会吸引不需要的选票/cmets

标签: javascript arrays object ecmascript-3


【解决方案1】:

您必须遍历两个数组并计算 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);

【讨论】:

  • 我们应该回答这些没有输入迹象的问题吗?
  • @Rajesh 值得商榷,但也许 OP 不知道该怎么做,所以答案会帮助他理解。人们可以希望 OP 会寻找并尝试理解解决方案,而不仅仅是复制它。另一种选择是忽略这个问题,但这对任何人都没有帮助。
  • @Dij 是的,这是有争议的,但 OP 甚至没有表现出他的尝试。 OP 提到了I've tried my way around but I can't figure it out,但没有显示他/她的尝试。
  • @Dij 我不喜欢回答这样的帖子的原因是它提倡用勺子喂食。人们把他们的输入数据和预期的输出。这对我来说是要求,而不是问题陈述。分享努力使它成为一个问题陈述,因为我们知道犯了什么错误。这也将有助于我们了解用户的级别,并且可以相应地格式化答案。但这只是我的 POV。
  • @Rajesh,谢谢你整理出来。我知道提出问题的方式看起来很像要求。这个问题很重要,我会学习的!
【解决方案2】:

您可以使用哈希表并将其用于计数。

您需要循环 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);

【讨论】:

  • 非常感谢!两个答案都有效,但我不知道哈希表。我会读进去的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2012-05-19
  • 2018-09-21
  • 2017-02-04
  • 2021-07-06
  • 2016-11-12
相关资源
最近更新 更多