Манипулирование массивом объектов Javascript - PullRequest
0 голосов
/ 24 августа 2018

У меня есть массив объектов, и мне нужно создать новый массив, который будет содержать значения определенного ключа в объектах. Есть ли более элегантный способ, чем следующий код (примечание: без использования чего-либо большего, чем JQuery). Ожидаемый результат: 455, 387, 495

var arr=[{sid:387,rank:2},{sid:455,rank:1},{sid:364,rank:4},{sid:495,rank:3}];
var topThreeTemp = arr.filter(function(a){return a.rank<4;}).sort(function(a,b){return a.rank>b.rank;});
var topThreeSIDs=[];
for(var i=0;i<topThreeTemp.length;i++){
    topThreeSIDs.push(topThreeTemp[i].sid);
}
console.log(topThreeSIDs.join(", "));

Ответы [ 5 ]

0 голосов
/ 24 августа 2018

Как насчет итерации массива только один раз и построения результирующего массива?

arr.reduce((r, {rank, sid})=>(rank < 4 && (r[rank -1] = sid), r), [])

var arr = [{ sid: 387, rank: 2 }, { sid: 455, rank: 1 }, { sid: 364, rank: 4 }, { sid: 495, rank: 3 }],
    top3 = arr.reduce((r, {rank, sid})=>(rank < 4 && (r[rank -1] = sid), r), []);
    
console.log(top3);

Примечание. Если вам нужны топ-3 в пределах высшего ранга 4, а также вы знаете, что звания уникальны, вы можете использовать это.Если звания не уникальны, вы можете использовать r.splice(rank-1, 0, sid) вместо r[rank-1] = sid и slice top 3 в конце.

0 голосов
/ 24 августа 2018
function pluck(objs, name, condition) {
        var sol = [];
        for (var i in objs) {
            if (objs[i].hasOwnProperty(name) && condition && condition(objs[i])) {
                // console.log(objs[i][name]);
                sol.push(objs[i][name]);
            }
        }
        return sol;
    }

    var arr = [{sid: 387, rank: 2}, {sid: 455, rank: 1}, {sid: 364, rank: 4}, {sid: 495, rank: 3}];
    var pluckedArray = pluck(arr, sid, function (item) {
        return item.rand < 4; // your custom condition
    })
0 голосов
/ 24 августа 2018

Использование Array.map

var arr=[{sid:387,rank:2},{sid:455,rank:1},{sid:364,rank:4},{sid:495,rank:3}];

var result = arr.filter(({rank}) => rank < 4).sort((a,b) => a.rank > b.rank).map(({sid}) => sid);
console.log(result.join(", "));
0 голосов
/ 24 августа 2018

Вы можете фильтровать, сортировать с дельтой, срезом и картой sid как массив результатов.

var array = [{ sid: 387, rank: 2 }, { sid: 455, rank: 1 }, { sid: 364, rank: 4 }, { sid: 495, rank: 3 }],
    top3 = array
        .filter(({ rank }) => rank < 4)
        .sort((a, b) => a.rank - b.rank)
        .slice(0, 3)
        .map(({ sid }) => sid);

console.log(top3.join(", "));
0 голосов
/ 24 августа 2018

Используйте ES6 map вместо for и функций стрелок ES6 (синтаксические сахара):

const arr = [
 { sid: 387,rank: 2 },
 { sid: 455,rank: 1 },
 { sid: 364,rank: 4 },
 { sid: 495,rank: 3 }
]

const topThreeSIDs = arr
  .filter(({ rank }) => rank < 4)
  .sort((a, b) => a.rank > b.rank)
  .map(({ sid }) => sid)
  

console.log(topThreeSIDs.join(', '))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...