Сортировать массив массива динамически на основе значения свойства в JavaScript - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть 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"}]]

Ответы [ 2 ]

3 голосов
/ 17 апреля 2019

С компаратором выполнена функция высшего порядка.

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")));
2 голосов
/ 17 апреля 2019

Вы можете найти требуемую недвижимость. Может быть, вам нужно значение по умолчанию, например, пустая строка.

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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...