Объедините два массива в массив объектов, считая дубликаты

Я пытаюсь объединить два массива в массив объектов, и я борюсь с этим.

Пример:

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, любые значения arr2, отсутствующие в arr1, просто не учитываются. (в этом примере это "d")

Также важно знать, что я использую это для Extendscript After Effects, который ограничивает меня 3-м изданием стандарта ECMA-262, оставляя меня со старым добрым классическим 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;
        }
    }
}

Пожалуйста, обратите внимание, что я не пытался обойтись проще, просто попросив у вас ответ, не пытаясь выяснить его, я просто не мог обдумать это по какой-то причине.

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

Вам придется перебирать оба массива и вести подсчет всех элементов в 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);

Другие вопросы по тегам