Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Сборка массива по повторяющемуся значению


Автор: vthm 30.10.2014, 01:14
есть массив

Код

var massiv = [
{1,2,1},
{1,2,2},
{1,3,2},
{2,3,3},
{2,3,3},
{1,5,5}
]


нужно обьединить те под массивы, у которых первый и второй елемент одинаковы, а третий елемент добавить друг к другу

то есть, получится
Код

{1,2,3} = {1,2,1} + {1,2,2}
{2,3,6} = {2,3,3} + {2,3,3}


Код

var result = [
{1,2,3},
{1,3,2},
{2,3,6},
{1,5,5}
]


помогите

Добавлено @ 01:14
Код

var result = {};
for (var i = 0; i < abc.length; i++) {
    var val = parseInt(abc[i][1], 10);
    var year = abc[i][0];
    if (year in result) {
        result[year] += val;
    } else {
        result[year] = val;
    }
}
for (year in result) {
    console.log('Year: ' + year + ' Sum: ' + result[year]);
}


но как сделать проверку по нескольким переменным?

Автор: Aliance 30.10.2014, 10:56
Многовато циклов, но пока что только такое решение в голову пришло.

Код

var array = [
    [1,2,1],
    [1,2,2],
    [1,3,2],
    [2,3,3],
    [2,3,3],
    [1,5,5]
];

var newArray = [];

array.forEach(function(value) {
    if (typeof newArray[value[0]] === 'undefined') {
        newArray[value[0]] = [];
    }
    if (typeof newArray[value[0]][value[1]] === 'undefined') {
        newArray[value[0]][value[1]] = 0;
    }
    newArray[value[0]][value[1]] += value[2];
});

var resultArray = [];

newArray.forEach(function(subArray, subIndex) {
    subArray.forEach(function(value, index) {
        resultArray.push([subIndex, index, value]);
    });
});

console.log(resultArray);

Автор: sQu1rr 30.10.2014, 12:58
А тут много мапов smile
Код

var array = [
    [1,2,1],
    [1,2,2],
    [1,3,2],
    [2,3,3],
    [2,3,3],
    [1,5,5]
];

var result = (function() {
    var temp = {};
    array.forEach(function(value) {
        var key = [value[0], value[1]].toString();
        temp[key] = (temp[key] || 0) + value[2];       
    });

    return Object.keys(temp).map(function(value) {
        return value.split(',').map(function(val) {
            return parseInt(val);
        }).concat(temp[value]);
    });
})();

Автор: Aliance 30.10.2014, 13:13
sQu1rr, воу воу воу, на 85% медленнее моего  smile 
http://jsperf.com/array-concatenate

Автор: sQu1rr 30.10.2014, 14:12
Если порядок не важен то можно так
Код

var array = [
    [1,2,1],
    [1,2,2],
    [1,3,2],
    [2,3,3],
    [2,3,3],
    [1,5,5]
];

var result = (function() {
    if (!array.length) return [];

    array.sort(function(lhv, rhv) {
        return lhv[0] - rhv[0] || lhv[1] - rhv[1];
    });

    var out = [], a = array[0][0], b = array[0][1], c = array[0][2];
    for (var i = 1; i < array.length; ++i) {
        var value = array[i];
        if (value[0] === a && value[1] === b) c += value[2];
        else {
            out.push([a, b, c]);
            a = value[0]; b = value[1]; c = value[2];
        }
    };
    out.push([a, b, c]);
    return out;
})();

Я тоже люблю мерится МПХ скоростью  smile 
http://jsperf.com/cock-comparison

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)