Как извлечь переменные из массива на основе их значения? - PullRequest
0 голосов
/ 13 февраля 2019

Я хранил переменные в массиве.Теперь мне нужно извлечь переменные с наивысшим значением и сохранить их в другом массиве.

Это для javascript-программы, запущенной на сайте wix для моей дочери.

var kiara = 1;
var rodeo = 3;
var calypso = 3;
var balthazar = 3;
var mistral = 4;
var saya = 4;
var luna = 4;

var points = [{kiara}, {rodeo}, {calypso}, {balthazar}, {mistral}, {saya}, {luna}],

Переменныеуже в порядке возрастания.Поэтому мне нужно, чтобы программа выяснила, что мистраль, сая и луна связаны в верхней позиции, а затем извлекли эти 3 переменные (имя переменных + соответствующие значения) и сохранили их в другом массиве.Если бы у меня был случай, когда у единственной переменной было самое высокое значение, то единственная переменная была бы сохранена в новом массиве.

Ответы [ 4 ]

0 голосов
/ 13 февраля 2019

Один из способов - сначала найти наибольшее значение, когда .map и .reduce работают вместе.Затем мы можем получить объекты из массива points, которые имеют свои первые свойства со значением maxValue, и поместить его в отдельный массив newArray.

var maxValue = points
    .map(function(obj){ return obj[Object.keys(obj)[0]]; }) //map into array of numbers
    .reduce(function(a, b){ return Math.max(a, b);}); // return max value

var newArray = points // filter objects with first prop = maxValue
    .filter(function(obj){ return obj[Object.keys(obj)[0]] === maxValue; });

Результат будет: [{mistral: 4}, {saya: 4}, {luna: 4}]

0 голосов
/ 13 февраля 2019

Поскольку ваш массив упорядочен, вы уже знаете, что значение maximun находится в последней позиции массива.Итак, сначала вы можете получить это значение, а затем вы можете использовать это значение для фильтра элементов, значения которых равны этому:

var kiara = 1;
var rodeo = 3;
var calypso = 3;
var balthazar = 3;
var mistral = 4;
var saya = 4;
var luna = 4;

var points = [{kiara}, {rodeo}, {calypso}, {balthazar}, {mistral}, {saya}, {luna}];

// Since array is ordered, highest value is at the last position.
// So, we can get it like this:
let maxVal = Object.values(points[points.length - 1])[0];
console.log(maxVal);

// Now, filter the array with the highest elements
let highest = points.filter(x => Object.values(x)[0] === maxVal);
console.log(highest)

В случае, если ваш исходный массив не упорядочен, как вы упомянули, вы можете продолжить что-то вроде этого:

var kiara = 1;
var rodeo = 3;
var calypso = 3;
var balthazar = 3;
var mistral = 4;
var saya = 4;
var luna = 4;

var points = [{saya}, {rodeo}, {mistral}, {balthazar}, {luna}, {kiara}, {calypso}];

// Since array is not ordered, we need to get highest value.
// So, we can get it like this:
let maxVal = points.reduce((max, v) => Math.max(Object.values(v)[0], max), null);
console.log(maxVal);

// Now, filter the array with the highest elements
let highest = points.filter(x => Object.values(x)[0] === maxVal);
console.log(highest)
0 голосов
/ 13 февраля 2019

Вот способ ES6 делать вещи.Пограничный случай списка не в порядке, поэтому самые высокие значения могут быть где угодно.Вы также можете изменить его, чтобы получить наименьшие значения.Если у вас есть какие-либо вопросы по поводу кода, просто спросите, и я отвечу.

const kiara = 1;
const rodeo = 3;
const calypso = 3;
const balthazar = 3;
const mistral = 4;
const saya = 4;
const luna = 4;


function getNamesWithHighestPoints(points) {
  const hash = {};

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

    let point = points[i];
    let name = Object.keys(point)[0];
    let score = Object.values(point)[0];

    if(hash[score] === undefined) {
      hash[score] = [point];
    }
    else {
      hash[score].push(point);
    }
  }

  let biggestScore = 0;
  Object.keys(hash).forEach(pointKey => {
    if(biggestScore < pointKey) {
      biggestScore = pointKey;
    }
  });
  return hash[biggestScore];
}
const points = [{kiara}, {rodeo}, {calypso}, {balthazar}, {mistral}, {saya}, {luna}];

console.log(getNamesWithHighestPoints(points));
0 голосов
/ 13 февраля 2019

Решение ниже.Был бы способ сделать это с меньшим количеством кода, но это сделает работу за вас.Помните одну вещь, поскольку в циклах ваш друг работает с объектами.

var kiara = 1;
var rodeo = 3;
var calypso = 3;
var balthazar = 3;
var mistral = 4;
var saya = 4;
var luna = 4;

var points = [{rodeo}, {calypso}, {balthazar}, {mistral}, {saya}, {luna},{kiara}];

var maxNumberArray = [];
var maxNamesArray = []; // ADDED THIS LINE
var max;

for(var char in points){
    for(var name in points[char]){
        if(!max){
            max = points[char][name];
        } else {
            if(max < points[char][name]){
                max = points[char][name];
            }
        }
    }
}

for(var char in points){
    for(var name in points[char]){
        if(points[char][name] === max){
            maxNumberArray.push(points[char]);
            maxNamesArray.push(name); // ADDED THIS LINE
        }
    }
}



console.log(JSON.stringify(maxNumberArray));
console.log(maxNamesArray); // ADDED this LINE

:)

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