首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含数组作为值和秩的排序字典

包含数组作为值和秩的排序字典
EN

Stack Overflow用户
提问于 2017-02-24 16:06:37
回答 3查看 240关注 0票数 1

我正在寻找最好的,最低限度的操作来解决这个问题。

代码语言:javascript
复制
var sourceDictionary = {
    "200" : [
        [ "a", 5 ],
        [ "al", 6 ],
        [ "xl", 8 ]
    ],
    "201" : [
        [ "b", 2 ],
        [ "al", 16 ],
        [ "al", 26 ],
        [ "al", 9 ],
        [ "al", 3 ]
    ],
    "202" : [
        [ "lm", 7 ]
    ]
}

我希望根据每个键中包含的整数值对字典进行排序,然后对每个值进行排序,如outputputDictionary所示。

代码语言:javascript
复制
var targetDictionary = {
    "200" : [
        [ "a", 5, "rank-7" ],
        [ "al", 6, "rank-6" ],
        [ "xl", 8, "rank-4" ]
    ],
    "201" : [
        [ "b", 2, "rank-9" ],
        [ "al", 16, , "rank-2" ],
        [ "al", 26, "rank-1" ],
        [ "al", 9, "rank-3" ],
        [ "al", 3, "rank-8" ]
    ],
    "202" : [
        [ "lm", 7, "rank-5" ]
    ]
}

例如,[ "al", 26, "rank-1" ] .This是级别-1,因为26是所有其他值中的最大值。

对于最佳的解决方案,Javascript是最可取的language.Looking

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-24 16:27:56

由于数组是通过引用传递的,因此可以这样使用:

代码语言:javascript
复制
function rankify(obj) {
  // PHASE 1: get a reference of all the sub-arrays
  var references = [];
  for(var key in obj) {               // for each key in the object obj
    obj[key].forEach(function(e) {    // for each element e (sub-array) of the array obj[key]
      references.push(e);             // push a reference of that array into reference array
    });
  }
  
  // PHASE 2: sort the references
  references.sort(function(a, b) {    // sort the items
    return b[1] - a[1];               // to reverse the sort order (a[1] - b[1])
  });
  
  // PHASE 3: assign the ranks
  references.forEach(function(e, i) { // for each array in the reference array
    e.push("rank-" + (i + 1));        // push another item ("rank-position") where the position is defined by the sort above
  });
}


var sourceDictionary = {"200" : [[ "a", 5 ],[ "al", 6 ],[ "xl", 8 ]],"201" : [[ "b", 2 ],[ "al", 16 ],[ "al", 26 ],[ "al", 9 ],[ "al", 3 ]],"202" : [[ "lm", 7 ]]};

rankify(sourceDictionary);
console.log(sourceDictionary);

如果允许使用箭头函数,则为

代码语言:javascript
复制
function rankify(obj) {
  Object.keys(obj)
        .reduce((ref, k) => ref.concat(obj[k]), [])    // get the references array
        .sort((a, b) => b[1] - a[1])                   // sort it
        .forEach((e, i) => e.push("rank-" + (i + 1))); // assign the rank
}


var sourceDictionary = {"200" : [[ "a", 5 ],[ "al", 6 ],[ "xl", 8 ]],"201" : [[ "b", 2 ],[ "al", 16 ],[ "al", 26 ],[ "al", 9 ],[ "al", 3 ]],"202" : [[ "lm", 7 ]]};

rankify(sourceDictionary);
console.log(sourceDictionary);

票数 3
EN

Stack Overflow用户

发布于 2017-02-24 16:33:39

这可以用几行代码来完成:

代码语言:javascript
复制
var sourceDictionary = {
    "200" : [
        [ "a", 5 ],
        [ "al", 6 ],
        [ "xl", 8 ]
    ],
    "201" : [
        [ "b", 2 ],
        [ "al", 16 ],
        [ "al", 26 ],
        [ "al", 9 ],
        [ "al", 3 ]
    ],
    "202" : [
        [ "lm", 7 ]
    ]
}

var flatten = arr => [].concat.apply([], arr)
var ranks = flatten(Object.keys(sourceDictionary)
    .map(k => sourceDictionary[k].map(t => t[1]))
  )
  .sort((a, b) => b - a)
  .filter( function( item, index, inputArray ) {
      // remove duplicates
      return inputArray.indexOf(item) == index;
  });

Object.keys(sourceDictionary)
  .forEach(k => sourceDictionary[k]
    .forEach(t => t.push("rank-" + (1 + ranks.indexOf(t[1])))))

console.log(sourceDictionary)

票数 0
EN

Stack Overflow用户

发布于 2017-02-24 16:35:10

您可以首先将其简化为存储原始对象中的key|index的数组,然后对其进行排序并添加秩属性,然后再创建对象。

代码语言:javascript
复制
var data = {
  "200" : [ [ "a", 5 ], [ "al", 6 ], [ "xl", 8 ] ],
  "201" : [ [ "b", 2 ], [ "al", 16 ], [ "al", 26 ], [ "al", 9 ], [ "al", 3 ] ],
  "202" : [ [ "lm", 7 ] ]
}

var o = Object.keys(data).reduce(function(r, e) {
  data[e].forEach((a, i) => r.push([e + '|' + i, a]))
  return r;
}, [])

o.sort((a, b) => b[1][1] - a[1][1]).map(function(e, i) {
  e[1][2] = 'rank-' + (i + 1)
})

var result = o.reduce(function(r, e) {
  var key = e[0].split('|')
  if (!r[key[0]]) r[key[0]] = []
  r[key[0]][key[1]] = e[1]
  return r
}, {})

console.log(result)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42443174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档