【问题标题】:Sort array of array dynamically based on propery value in javascript根据javascript中的属性值动态排序数组数组
【发布时间】:2019-04-17 11:04:26
【问题描述】:

我有 JSON,每个记录属性都有单独的对象,我想按属性动态排序。

我设法用属性进行排序,但它是静态代码。我怎样才能使它动态呢?

请在https://jsfiddle.net/b8fv4L1z/3/上找到运行代码

var json = [
  [
    {
      "apiName": "Name",
      "value": "Bob"
      },
    {
      "apiName": "CompanyName",
      "value": "Google"
    }
  ],
  [
    {
      "apiName": "Name",
      "value": "Micky"
    },
    {
      "apiName": "CompanyName",
      "value": "Amazon"
    }
  ],
  [
    {
      "apiName": "Name",
      "value": "Donal"
    },
    {
      "apiName": "CompanyName",
      "value": "Facebook"
    }
  ]
];


 function Comparator(a, b, ) {

   if (a[1].value < b[1].value) return -1; // a[1] sort by CompanyName If I put a[0] it will sort by Name.
   if (a[1].value > b[1].value) return 1; // a[1] sort by CompanyName If I put a[0] it will sort by Name.
   return 0;
 }

json = json.sort(Comparator);
console.log(JSON.stringify(json));


预期结果:

(按 apiName = CompanyName 排序):

 [[{"apiName":"Name","value":"Micky"},{"apiName":"CompanyName","value":"Amazon"}],[{"apiName":"Name","value":"Donal"},{"apiName":"CompanyName","value":"Facebook"}],[{"apiName":"Name","value":"Bob"},{"apiName":"CompanyName","value":"Google"}]]

(按 apiName = 名称排序):

     [[{"apiName":"Name","value":"Bob"},{"apiName":"CompanyName","value":"Google"}],[{"apiName":"Name","value":"Donal"},{"apiName":"CompanyName","value":"Facebook"}],[{"apiName":"Name","value":"Micky"},{"apiName":"CompanyName","value":"Amazon"}]]

【问题讨论】:

  • 请同时添加想要的结果。按name 排序的规则是什么?你有嵌套数组。排序应该在哪个数组上进行?
  • 作为,我有更新。预期结果应该是简短的属性。我可以设法按静态值进行排序。我想让它动态化。目前我有两个属性(名称和公司名称),将来我有多个属性。我如何动态地制作它。

标签: javascript arrays json sorting


【解决方案1】:

用比较器做高阶函数。

var json = [
  [{
      "apiName": "Name",
      "value": "Bob"
    },
    {
      "apiName": "CompanyName",
      "value": "Google"
    }
  ],
  [{
      "apiName": "Name",
      "value": "Micky"
    },
    {
      "apiName": "CompanyName",
      "value": "Amazon"
    }
  ],
  [{
      "apiName": "Name",
      "value": "Donal"
    },
    {
      "apiName": "CompanyName",
      "value": "Facebook"
    }
  ]
];

function findValueByProperty(item, propertyName) {
  var relevantRow = item.find(function(content) {
    return content.apiName === propertyName;
  });
  return relevantRow.value;
}

function comparator(propertyName) {
  return function(a, b) {
    var valueA = findValueByProperty(a, propertyName);
    var valueB = findValueByProperty(b, propertyName);
    return valueA.localeCompare(valueB)
  }
}

console.log('json==>' + JSON.stringify(json));
console.log(json.slice().sort(comparator("CompanyName")));
console.log(json.slice().sort(comparator("Name")));

【讨论】:

  • 谢谢分享,我只知道propertt名字。我怎样才能找到相同的索引?例如:按 Name 或 CompanyName 或其他值排序(不删除哪个索引)
  • 编辑执行查找属性名称。
  • 我的原始答案和 Piyush 的评论都早于您的答案。
【解决方案2】:

你可以找到想要的财产。也许你需要一个默认值,比如一个空字符串。

function sort(array, apiName) {
    const
        getValue = array => 
            (array.find(o => o.apiName === apiName) || { value: '' }).value;

    return array.sort((a, b) => getValue(a).localeCompare(getValue(b)));
}

var array = [[{ apiName: "Name", value: "Bob" }, { apiName: "CompanyName", value: "Google" }], [{ apiName: "Name", value: "Micky" }, { apiName: "CompanyName", value: "Amazon" }], [{ apiName: "Name", value: "Donal" }, { apiName: "CompanyName", value: "Facebook" }]];

console.log(sort(array, 'CompanyName'));
console.log(sort(array, 'Name'));
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果您始终拥有相同的数据结构,则可以提前获取apiName 并进行排序,而无需找到每个元素。

function sort(array, apiName) {
    const index = array[0].findIndex(o => o.apiName === apiName);

    return array.sort((a, b) => a[index].value.localeCompare(b[index].value));
}

var array = [[{ apiName: "Name", value: "Bob" }, { apiName: "CompanyName", value: "Google" }], [{ apiName: "Name", value: "Micky" }, { apiName: "CompanyName", value: "Amazon" }], [{ apiName: "Name", value: "Donal" }, { apiName: "CompanyName", value: "Facebook" }]];

console.log(sort(array, 'CompanyName'));
console.log(sort(array, 'Name'));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 2014-08-05
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多