两道面试算法题:一个对象包含着两个数组(这两个数组有对应关系),现在要求写一个方法将这个两个数组整合成一个对象数组。

例如一个这样的对象

var rs = {
    head: ["id", "name"], 
    data: [ [100, "Tom"], [101, "Jane"] ] 
};

经过一个方法处理后结果为:

arr = [
    {id: 100, name: "Tom"},
    {id: 101, name: "Jane"} 
]

还有另一题是:

将数据按照条件分类,例如:

//数据
var rs = {
    head: ["id", "name"], 
    data: [ [100, "Tom"], [101, "Jane"], [102, "Tom"] ] 
};

var result1=fun(rs,"name");
var result2=fun(rs,"id");
//结果
result1 = {
    "Tom": [{id: 100, name: "Tom"}, {id: 102, name: "Tom"}],
    "Jane": [{id: 101, name: "Jane"}]
}
result2 = {
    100: [{id: 100, name: "Tom"}],
    101: [{id: 101, name: "Jane"}],
    102: [{id: 102, name: "Tom"}]
}

可以使用jquery,想了很久没想出解决办法,希望有大神指点。

阅读 3.8k
1 个回答

第一题:

var rs = {
    head: ["id", "name"], 
    data: [ [100, "Tom"], [101, "Jane"] ] 
};

console.log(JSON.stringify(normalize(rs)));

// 范式化,第二题会用到
function normalize (rs) {
    return rs.data.map(dataItem => 
        rs.head.reduce((itemResult, itemKey, curIndex) => 
            ((itemResult[itemKey] = dataItem [curIndex]), itemResult)
        , {})
    );
}

第二题:

var rs = {
    head: ["id", "name"], 
    data: [ [100, "Tom"], [101, "Jane"], [102, "Tom"] ] 
};

console.log(JSON.stringify(func(rs, 'id')));

console.log(JSON.stringify(func(rs, 'name')));

function func (rs, groupBy) {
  var normalizedData = normalize(rs);

  return normalizedData.reduce((ret, dataItem) => {
        var schemaKey = dataItem[groupBy]; 

        if (ret[schemaKey]) {
           ret[schemaKey].push(dataItem);
        } else {
           ret[schemaKey] = [dataItem];
        }

        return ret;
     }
  , {});
}

最后,提问和html没有什么关系,建议去掉html这个标签。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题