javascript bookmarklet для добавления текста в середину текущего URL [дубликат]

Используйте ключевое слово key для функции sorted() и sort() :

yourdata.sort(key=lambda e: e['key']['subkey'], reverse=True)

Демонстрация:

>>> yourdata = [{'key': {'subkey': 1}}, {'key': {'subkey': 10}}, {'key': {'subkey': 5}}]
>>> yourdata.sort(key=lambda e: e['key']['subkey'], reverse=True)
>>> yourdata
[{'key': {'subkey': 10}}, {'key': {'subkey': 5}}, {'key': {'subkey': 1}}]

Это предполагает, что все словари верхнего уровня имеют ключ key, который считается словарем с клавишей subkey.

См. Python Sorting HOWTO для получения более подробной информации и трюков.

222
задан bdkopen 14 July 2017 в 03:08
поделиться

13 ответов

Вы можете прототипировать свой собственный splice() в String.

Polyfill

if (!String.prototype.splice) {
    /**
     * {JSDoc}
     *
     * The splice() method changes the content of a string by removing a range of
     * characters and/or adding new characters.
     *
     * @this {String}
     * @param {number} start Index at which to start changing the string.
     * @param {number} delCount An integer indicating the number of old chars to remove.
     * @param {string} newSubStr The String that is spliced in.
     * @return {string} A new string with the spliced substring.
     */
    String.prototype.splice = function(start, delCount, newSubStr) {
        return this.slice(0, start) + newSubStr + this.slice(start + Math.abs(delCount));
    };
}

Пример

String.prototype.splice = function(idx, rem, str) {
    return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem));
};

var result = "foo baz".splice(4, 0, "bar ");

document.body.innerHTML = result; // "foo bar baz"


EDIT: Изменено, чтобы убедиться, что rem является абсолютным значением.

199
ответ дан Mr. Polywhirl 16 August 2018 в 11:19
поделиться
  • 1
    @MuhammadAbrar Это Array.splice (), а не для строк. – Dan7 28 June 2012 в 11:29
  • 2
    Вы должны объяснить, что rem. – Alvaro 22 April 2015 в 15:25
  • 3
    Я знаю, что это старо, но для новых людей, видящих этот ответ, это количество старых символов, которые вы хотите удалить. – The Mahahaj 15 September 2015 в 17:46
  • 4
    Я знаю, что это с 2010 года, но ниже slice решение лучше и проще. (Splice - разрушительный, срез - нет, и лучше избегать модификации «объектов, которые вы не знаете»). Это решение абсолютно не должно быть первым видимым ответом, хотя в то время это могло иметь смысл. – Eirik Birkeland 20 August 2016 в 07:56
  • 5
    @EirikBirkeland: Строки неизменяемы. Вышеприведенный код не изменяет никакого объекта. В любом случае, ваше понятие о том, что вы не изменяете объекты & quot; вы не знаете & quot; будет препятствовать методам мутации Array. Вы говорите, что лучше my_array[my_array.length] = item вместо my_array.push(item)? – user 17 September 2016 в 16:08

Попробуйте это. Вот метод, который я написал, который ведет себя как все другие программирующие языки.

String.prototype.insert = function (index, string) {
  if (index > 0)
    return this.substring(0, index) + string + this.substring(index, this.length);
  else
    return string + this;
};

Пример использования:

var something = "How you?";
something = something.insert(3, " are");

Симпсоны.

Ссылка: http://coderamblings.wordpress.com/2012/07/09/insert-a-string-at-a-specific-index/

111
ответ дан Base33 16 August 2018 в 11:19
поделиться
  • 1
    Возможно, вам придется добавить фигурные скобки {} в блоки if-else. – Mr-IDE 29 May 2018 в 11:43
  • 2
    Нет, не нужно. Но else является избыточным. – Bitterblue 16 July 2018 в 10:16

Учитывая ваш текущий пример, вы можете достичь результата либо

var txt2 = txt1.split(' ').join(' bar ')

, либо

var txt2 = txt1.replace(' ', ' bar ');

, но при условии, что вы можете сделать такие предположения, вы можете также пропустить непосредственно к примеру Gullen.

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

6
ответ дан David Hedlund 16 August 2018 в 11:19
поделиться

Просто выполните следующую функцию:

function insert(str, index, value) {
    return str.substr(0, index) + value + str.substr(index);
}

, а затем используйте ее так:

alert(insert("foo baz", 4, "bar "));

Выход: foo bar baz

Он ведет себя точно так же, как C # (Sharp) String.Insert (int startIndex, строковое значение).

ПРИМЕЧАНИЕ. Эта функция вставки вставляет строковое значение (третий параметр) до указанного целочисленного индекса (второго параметра) в string str (первый параметр), а затем возвращает новую строку без изменения str!

48
ответ дан Farewell Stack Exchange 16 August 2018 в 11:19
поделиться

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

var text = "something";
var output = "                    ";
var pattern = new RegExp("^\\s{"+text.length+"}");
var output.replace(pattern,text);

выходы:

"something      "

Это заменяет text.length пробельных символов в начале строки output. RegExp означает ^\ - начало строки \s любого символа пробела, повторение {n} раз, в данном случае text.length. Используйте \\ к \, чтобы избежать обратных косых черт при построении таких шаблонов из строк.

3
ответ дан Inoperable 16 August 2018 в 11:19
поделиться

Если кто-то ищет способ вставки текста по нескольким индексам в строке, попробуйте это:

String.prototype.insertTextAtIndices = function(text) {
    return this.replace(/./g, function(character, index) {
        return text[index] ? text[index] + character : character;
    });
};

Например, вы можете использовать это для вставки тэгов <span> при определенных смещениях в строке:

var text = {
    6: "<span>",
    11: "</span>"
};

"Hello world!".insertTextAtIndices(text); // returns "Hello <span>world</span>!"
7
ответ дан Jake Stoeffler 16 August 2018 в 11:19
поделиться
  • 1
    Я попробовал этот метод, но заменил «6» и «11» на переменные, которые он не работает - что я делаю неправильно - помогите пожалуйста. Заранее спасибо :) – Dex Dave 12 May 2015 в 18:35
  • 2
    6 и 11 - индексы, в которые текст будет вставлен в строку. 6: "<span>" говорит: в индексе 6 вставить текст & quot; & lt; span & gt; ". Вы говорите, что хотите использовать значение целочисленной переменной в качестве индекса вставки? Если это так, попробуйте что-то вроде var a=6, text = {}; text[a] = "<span>"; – Jake Stoeffler 12 May 2015 в 20:37
  • 3
    да, я хочу использовать целочисленные переменные в качестве вставки, ваш метод работал - спасибо - вот что я использовал var a = 6; var b = 11; text = {}; текст [a] = "xx"; текст [b] = "yy"; - есть лучший способ написать, что хотя – Dex Dave 12 May 2015 в 21:30

другое решение, вырежьте строку в 2 и поместите между ними строку.

var str = jQuery('#selector').text();

var strlength = str.length;

strf = str.substr(0 , strlength - 5);
strb = str.substr(strlength - 5 , 5);

jQuery('#selector').html(strf + 'inserted' + strb);
2
ответ дан mudshark2005 16 August 2018 в 11:19
поделиться
function insertString(string, insertion, place) {
  return string.replace(string[place] + string[place + 1], string[place] + insertion + string[place + 1])
}

Итак, для вас это будет insertString("foo baz", "bar", 3);

Очевидно, что это будет краска для использования, потому что вы должны каждый раз передавать свою строку в функцию, но на момент я не знаю, как сделать его чем-то более легким, как string.replace(insertion, place). Однако идея все еще стоит.

3
ответ дан Quelklef 16 August 2018 в 11:19
поделиться

Это в основном делает то, что делает @ Bass33, за исключением того, что я также даю возможность использовать отрицательный индекс для подсчета с конца.

// use a negative index to insert relative to the end of the string.

String.prototype.insert = function (index, string) {
  var ind = index < 0 ? this.length + index  :  index;
  return  this.substring(0, ind) + string + this.substring(ind, this.length);
};

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

var url = '/images/myimage.jpg';
var thumb = url.insert(-4, '_thm');

//    result:  '/images/myimage_thm.jpg'
7
ответ дан Ryan Ore 16 August 2018 в 11:19
поделиться

Я знаю, что это старый поток, однако, это действительно эффективный подход.

var tn = document.createTextNode("I am just  to help")
t.insertData(10, "trying");

Что здорово в этом, так это то, что он приводит в порядок содержимое узла. Поэтому, если этот узел уже был на DOM, вам не нужно будет использовать селектор запросов или обновлять innerText. Изменения будут отображаться из-за его привязки.

Если вам нужна строка, просто войдите в свойство текстового содержимого узла.

tn.textContent
#=> "I am just trying to help"
0
ответ дан Sebastian Scholl 16 August 2018 в 11:19
поделиться

Вставка с определенным индексом (а не, скажем, при первом символе пробела) должна использовать строковое срез / подстрока:

var txt2 = txt1.slice(0, 3) + "bar" + txt1.slice(3);
273
ответ дан Tim Down 16 August 2018 в 11:19
поделиться
  • 1
    Почему не подстрока? – Alejandro Salamanca Mazuelo 9 November 2015 в 17:26
  • 2
    @AlejandroSalamancaMazuelo: substring будет хорошо здесь. Я предпочитаю slice вообще, потому что он более гибкий (отрицательные индексы, например "foo baz".slice(1, -2)). Это также немного короче, для мало того, что стоит. – Tim Down 9 November 2015 в 17:36
  • 3
    Предлагает ли ES6 лучшую альтернативу? Может, по крайней мере, использовать интерполяцию строк, например `${txt1.slice(0,3)}bar${txt1.slice(3)}` – Jay 17 November 2015 в 19:54
  • 4
    Это не использует функцию delete, которая включена в выше; верхний ответ ... – Mr. Polywhirl 24 November 2015 в 20:08
  • 5
    @ Mr.Polywhirl: Нет. В этом вопросе не упоминается, что нужно это делать. – Tim Down 25 November 2015 в 12:06
my_string          = "hello world";
my_insert          = " dear";
my_insert_location = 5;

my_string = my_string.split('');  
my_string.splice( my_insert_location , 0, my_insert );
my_string = my_string.join('');

https://jsfiddle.net/gaby_de_wilde/wz69nw9k/

4
ответ дан user40521 16 August 2018 в 11:19
поделиться

UPDATE 2016: Вот еще одна функция just-for-fun (но более серьезная!), основанная на подходе с одним слоем RegExp (с поддержкой prepend на undefined или отрицательный index):

/**
 * Insert `what` to string at position `index`.
 */
String.prototype.insert = function(what, index) {
    return index > 0
        ? this.replace(new RegExp('.{' + index + '}'), '$&' + what)
        : what + this;
};

console.log( 'foo baz'.insert('bar ', 4) );  // "foo bar baz"
console.log( 'foo baz'.insert('bar ')    );  // "bar foo baz"

Предыдущий (назад к 2012 году) решение для веселого :

var index = 4,
    what  = 'bar ';

'foo baz'.replace(/./g, function(v, i) {
    return i === index - 1 ? v + what : v;
});  // "foo bar baz"
11
ответ дан VisioN 16 August 2018 в 11:19
поделиться
  • 1
    Это также отлично, если вам нужно вставить текст с несколькими индексами в строке. См. Мой ответ ниже, если это так. – Jake Stoeffler 15 August 2014 в 16:27
Другие вопросы по тегам:

Похожие вопросы: