заполнить массив на основе объекта и другого массива строк - PullRequest
1 голос
/ 26 октября 2019

У меня есть массив предложений и объект, на которые его свойства указывают каждый индекс предложения, и значения, представляющие оценку предложения следующим образом:

var sentences = ['I am', 'I am a good doctor', 'I am a doctor', 'I am a']; // sentence with index 0 score 10 and sentence with index 3 score 90 .   
var object = { 0: 10, 1: 100, 2: 80, 3: 90}; // index of sentences with their scores

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

    var object = {0: 10, 1: 100, 2: 80, 3: 90},
        max = Math.max(...Object.values(object)),
        result = Object
            .keys(object)
            .filter(k => object[k] !== max)
            .map(Number);
    
    console.log(result);

Приведенный выше код работает нормально, пока у нас не будет более одного максимального значения, такого как (равное и самое высокое):

var object = {0: 10, 1: 100, 2: 100, 3: 100};

На этот раз resultмассив возвращает только [0], и мы теряем все равные и самые высокие из них.

Я хочу изменить код так, чтобы, если мы столкнулись с такой ситуацией, то было удалено только предложение с большей длиной .

Таким образом, в нашем примере sentences[1] = 'I am a good doctor' является самым длинным из индексов 1, 2 и 3, тогда мы просто удаляем его, и конечный результат будет:

result = [0, 2, 3]

Я попробовалмного, но как бы я ни старался, в конце концов, я просто запутался ... :(

Ответы [ 4 ]

2 голосов
/ 26 октября 2019

Вы также можете использовать метод sort, а затем отбросить элемент, отсортированный в верхнем конце:

var sentences = ['I am', 'I am a good doctor', 'I am a doctor', 'I am a'];
var object = { 0: 10, 1: 100, 2: 80, 3: 90};

var result = Object.keys(object).map(Number)
                   .sort((i, j) => object[i] - object[j] || 
                                   sentences[i].length - sentences[j].length);
result.pop(); // discard last
console.log(result);
1 голос
/ 26 октября 2019

Просто добавьте проверку lengths максимум тоже:

var sentences = ['I am', 'I am a good doctor', 'I am a doctor', 'I am a'];

var object = {0: 10, 1: 100, 2: 100, 3: 100},
lengthsMax = Math.max(...sentences.map(s => s.length)),
max = Math.max(...Object.values(object)),
result = Object
    .keys(object)
    .filter(k => object[k] !== max || sentences[k].length !== lengthsMax)
    .map(Number);
console.log(result);
1 голос
/ 26 октября 2019

Требуемый результат - это объединение результатов со счетом, меньшим, чем max, и результатов со значением, равным макс.

const sentences = ['I am', 'I am a good doctor', 'I am a doctor', 'I am a'];
const object = {0: 10, 1: 100, 2: 100, 3: 100};
const max = Math.max(...Object.values(object));
const objectKeys =  Object.keys(object);

const equalValues = objectKeys.map((k,i) => object[k] === max ? sentences[i].length : 0);

const lengthsMax = Math.max(...equalValues);
const resultEqualToMax  = objectKeys
    .filter((k,i) => object[k] === max && sentences[i].length !== lengthsMax)   
    .map(Number);
const resultLessThenMax = objectKeys
    .filter(k => object[k] !== max)
    .map(Number);
const result = [...resultLessThenMax,...resultEqualToMax];
console.log(result);
1 голос
/ 26 октября 2019

Если вы должны сохранить данные такими, как есть, попробуйте это. Я использовал предложение, сделанное @Daniyal Lukmanov в своем ответе.

var sentences = ['I am', 'I am a good doctor', 'I am a doctor', 'I am a'];
var object = {0: 10, 1: 80, 2: 100, 3: 100};

maxScore = Math.max(...Object.values(object));

var maxScoreSentences = [];

for (var i=0; i <sentences.length; i++){
  if(object[i] === maxScore) {
    maxScoreSentences.push(sentences[i]);
  }
}

lengthsMax = Math.max(...maxScoreSentences.map(s => s.length));

result = Object
    .keys(object)
    .filter(k => object[k] !== maxScore || sentences[k].length !== lengthsMax)
    .map(Number);
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...