Javascript Заменить элемент, если ключ дублируется, сортировать и удалять, кроме последних 2 элементов - PullRequest
0 голосов
/ 08 мая 2019

У меня есть массив, как показано ниже, я хочу отсортировать его по ключу, а затем удалить все, кроме двух последних элементов, и удалить оставшиеся.

var status = new Array();
status.push({key: 'BOB', value: 10});
status.push({key: 'TOM', value: 3});
status.push({key: 'ROB', value: 22});
status.push({key: 'JON', value: 7});

Если я снова нажму ниже с дублирующим ключом, например:

status.push({key: 'BOB', value: 20});

Мне нужен следующий вывод, как мне добиться этого в JavaScript.

[
  {
    "key": "BOB",
    "value": 20
  },
  {
    "key": "TOM",
    "value": 3
  },
  {
    "key": "ROB",
    "value": 22
  },
  {
    "key": "JON",
    "value": 7
  }
]

Примечание: мне нужно отсортировать это по ключу позже.

Редактировать: Если у меня есть такой объект, как сортировать по ключам? и получите только последние 2 элемента и удалите оставшиеся.

var status = new Object();
status['BOB'] = 10
status['TOM'] = 3
status['ROB'] = 22
status['JON'] = 7

Ответы [ 4 ]

1 голос
/ 09 мая 2019

Я бы использовал Map, а не массив или объект.Карты похожи на объекты , но с некоторыми важными отличиями .

// initialize the map
var stats = new Map([['BOB',10],['TOM',3],['ROB',22],['JON',7]]);
// set a specific key's value
stats.set('BOB', 20);
// sort by key
var keys = Array.from(stats.keys());
keys.sort();
// get the last two
keys = keys.slice(-2);
// map the remaining keys to the desired structure
var result = keys.map(key => { 
  return { 
    key: key, 
    value: stats.get(key) 
  }; 
});
console.log(result);
0 голосов
/ 08 мая 2019

если вы хотите сделать так, как предлагают другие, вы должны использовать set set, в котором всегда есть уникальные элементы

// initialize the map
var stats = new Set([['BOB',10],['TOM',3],['ROB',22],['JON',7]]);
// set a specific key's value
stats.add('BOB', 20);
// sort by key
var keys = Array.from(stats.keys());
keys.sort();
// get the last two
keys = keys.slice(-2);
// map the remaining keys to the desired structure
var result = keys
console.log(result);

Я думаю, что это отвечает на все ваши вопросы

let status1 = [];
status1.push({
    key: 'BOB',
    value: 10
}, {
    key: 'TOM',
    value: 3
}, {
    key: 'ROB',
    value: 22
}, {
    key: 'JON',
    value: 7
});

console.log('Initial array', status1);

//const newItem = {
//  key: 'BOB',
//  value: 20
//};

const newItem = {
    key: 'BOB',
    value: 99
};

for (let i = 0; i < status1.length; i++) {

    if (status1[i].key === newItem.key) {
        status1[i] = newItem;
    }

}

Array.prototype.inArray = function(comparer) { 
    for(var i=0; i < this.length; i++) { 
        if(comparer(this[i])) return true; 
    }
    return false; 
}; 
Array.prototype.pushIfNotExist = function(element, comparer) { 
    if (!this.inArray(comparer)) {
        this.push(element);
    }
}; 

//https://stackoverflow.com/questions/1988349/array-push-if-does-not-exist 

status1.pushIfNotExist(newItem, function(e) { 
    return e.key === newItem.key; 
});

console.log('after push', status1);

function sortByKey(array, key) {
    return array.sort(function (a, b) {
        var x = a[key];
        var y = b[key];
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    });
}

sortByKey(status1, 'key');
console.log('AFter sort', status1);

console.log('Last item', status1[status1.length - 1]);
console.log('Second Last item', status1[status1.length - 2]);
0 голосов
/ 09 мая 2019

В случае, если вы решите сохранить структуру массива объектов, вы можете реализовать метод, используя Array.findIndex () и Array.splice () следующим образом:

const pushWithCheck = (arr, obj) =>
{
    let idx = arr.findIndex(({key}) => key === obj.key);

    if (idx >= 0)
        arr.splice(idx, 1, obj);
    else
        arr.push(obj);
}

var _status = [];
pushWithCheck(_status, {key: 'BOB', value: 10});
pushWithCheck(_status, {key: 'TOM', value: 3});
pushWithCheck(_status, {key: 'ROB', value: 22});
pushWithCheck(_status, {key: 'JON', value: 7});
console.log("Before duplicated key:", _status);
pushWithCheck(_status, {key: 'BOB', value: 20});
pushWithCheck(_status, {key: 'ROB', value: 99});
console.log("After duplicated key:", _status);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

Теперь, чтобы отсортировать по свойству key объектов и получить последние 2 элементы, вы можете использовать Array.sort () и Array.slice () с отрицательным (-2) аргументом, например:

const pushWithCheck = (arr, obj) =>
{
    let idx = arr.findIndex(({key}) => key === obj.key);

    if (idx >= 0)
        arr.splice(idx, 1, obj);
    else
        arr.push(obj);
}

// Generate the _status array.
var _status = [];
pushWithCheck(_status, {key: 'BOB', value: 10});
pushWithCheck(_status, {key: 'TOM', value: 3});
pushWithCheck(_status, {key: 'ROB', value: 22});
pushWithCheck(_status, {key: 'JON', value: 7});
pushWithCheck(_status, {key: 'BOB', value: 20});
pushWithCheck(_status, {key: 'ROB', value: 99});
console.log("_status is: ", _status);

// Sort the _status array by ascending.
let sorted = _status.slice().sort((a, b) => a.key.localeCompare(b.key));

// Get last two elements of the sorted array.
let lastTwo = sorted.slice(-2);

console.log("Sorted is: ", sorted);
console.log("Last two elements are: ", lastTwo);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
0 голосов
/ 08 мая 2019

Вместо использования массива используйте объект:

(function () {
  var status = {};
  status['BOB'] = 10;
  status['TOM'] = 3;
  status['ROB'] = 22;
  status['JON'] = 7;
  status['BOB'] = 20;
  // convert to array
  var output = Object.keys(status)
    // sort by key
    .sort()
    // keep last two after sorting
    .slice(-2)
    // convert [key, value] to { key, value }
    .map(function (key) {
      return { key: key, value: status[key] };
    });

  console.log(output);
})();
.as-console-wrapper{max-height:100%!important}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...