鍍金池/ 問答/HTML/ 數(shù)組轉(zhuǎn)換的算法問題?

數(shù)組轉(zhuǎn)換的算法問題?

題目描述

有如下數(shù)組,格式按給定例子一樣,a-b形式:

let arr = ['1-2', '2-8', '1-3', '2-4', '6-10', '2-5']

需要轉(zhuǎn)換成如下數(shù)組:

[
    { key: 1, values: [2, 3] },
    { key: 2, values: [4, 5, 8] },
    { key: 6, values: [10] },
]

求解此方法

回答
編輯回答
怪痞

大家思路都很好,謝謝。

2018年7月2日 20:48
編輯回答
臭榴蓮

這個(gè)其實(shí)分成兩步處理就好弄了,我說具體實(shí)現(xiàn)過程(偽代碼描述),注意這個(gè)不能保障最后數(shù)組對象的順序,而不是最后結(jié)果

let arr = ['1-2', '2-8', '1-3', '2-4', '6-10', '2-5'];
// 先把數(shù)組轉(zhuǎn)換成 key:[]的對象,
function ma2o(arr){
    var ort={};
    for(let i=0;i<arr.length;i++){
        let sa=arr[i].split('-');
        ort[ sa[0] ]?(ort[ sa[0] ].push( sa[1] ) ): (ort[ sa[0] ]=[ sa[1] ]);
        console.log(ort);
    }
    return ort;
}
//最后再把中間對象按要求輸出
function mo2a(obj){
    console.log(obj);
    var rt=[];
    for(k in obj){
        var tmp={key:k,values:obj[k]};
        rt.push(tmp);
    }
    return rt;
}
let rt=mo2a(ma2o(arr));

console.log(rt);
2017年12月17日 03:41
編輯回答
別逞強(qiáng)
function fk(arr) {

    // {'1': ['2','3'], '2': ['4','5','8'], '6': ['10']}
    let tmpObj = arr.reduce((iter, val) => {
        let [k, v] = val.split('-')
        iter[k] ? iter[k].push(v) : iter[k] = [v]
        return iter
    }, {})

    // [{ key: 1, values: [2, 3] }, { key: 2, values: [4, 5, 8] }, { key: 6, values: [10] }]
    let rst = Object.keys(tmpObj).map(v => ({
        key: +v,
        values: +tmpObj[v]
    }))

    return rst
}
2017年5月10日 14:00
編輯回答
久不遇
let arr = ['1-2', '2-8', '1-3', '2-4', '6-10', '2-5']

function convert(data) {
    const dict = data.map(t => t.split("-"))
        .reduce((agg, pair) => {
            (agg[pair[0]] = agg[pair[0]] || []).push(pair[1]);
            return agg;
        }, {});

    return Object.keys(dict)
        .map(key => ({ key, values: dict[key] }));
}

console.log(JSON.stringify(convert(arr), null, 4));

// [
//     { key: 1, values: [2, 3] },
//     { key: 2, values: [4, 5, 8] },
//     { key: 6, values: [10] },
// ]
2018年5月15日 18:55
編輯回答
未命名
function f(list) {
  const obj = {};
  list.forEach(item => {
    let [key, val] = item.split('-');
    if (obj[key]) {
      obj[key].push(val);
    } else {
      obj[key] = [val];
    }
  });
  return Object.keys(obj).map(key => {
    return {
      key,
      values: obj[key],
    };
  });
}
2017年5月6日 04:44
編輯回答
瘋浪
let arr = ['1-2', '2-8', '1-3', '2-4', '6-10', '2-5']
const obj = arr
            .map(v => v.split('-'))
            .reduce((init, [key, val]) => {
                (init[key] = init[key] || []).push(val)
                return init;
            }, {})
const result = Object.entries(obj).map(([key, values]) => ({key, values}))
2018年7月7日 19:36
編輯回答
咕嚕嚕
let arr = ['1-2', '2-8', '1-3', '2-4', '6-10', '2-5'];

const fn = arr =>
{
    const obj = {};
    arr.forEach(data => {
        let n = data.split('-');
        console.log(n);
        if (!obj[n[0]]) {
            obj[n[0]] = [n[1]];
        }else {
            obj[n[0]].push(n[1]);
        }
    })
    return obj;
}

fn(arr);

試試這個(gè),需要寫注釋的話,說下,我給你寫注釋

2017年1月31日 04:57
編輯回答
背叛者
let arr = ['1-2', '2-8', '1-3', '2-4', '6-10', '2-5'];

const result = Object.values(arr.reduce((res, val) => {
  const s = val.split('-');
  res[s[0]] ? res[s[0]].values.push(s[1]) : res[s[0]] = {key: s[0], values: [s[1]]};
  return res
}, {})).map(item => {
  item.values.sort((a, b) => a - b);
  return item;
});

console.log(result)
2017年3月26日 18:44