Объект Javascript не имеет никакой операции слияния. Если у вас есть два объекта, скажите
{a:1, b:2}
{c:3, d:4}
И хочу получить
{a:1, b:2, c:3, d:4}
Насколько я знаю, вам нужно перебирать объекты. То есть вы решаете либо стратегию слияния влево, либо стратегию слияния, а затем вы делаете что-то вроде (упрощенного)
for (key in object2) {
object1[key] = object2[key];
}
Это нормально. Однако Javascript имеет функцию call
и prototype
. Например, поворот arguments
в Array
можно сделать с помощью
Array.prototype.slice.call(arguments)
Этот подход использует существующий собственный код, поэтому он менее восприимчив к глупому программисту и должен работать быстрее, чем не-native-реализация.
Вопрос
Есть ли уловка для использования этого шаблона прототипа/вызова, возможно, для функций обхода Attribute
или Node
объекта DOM или, возможно, некоторых из общих String
функций, чтобы выполнить слияние собственных объектов?
Код выглядит примерно так:
var merged = somethingrandom.obscuremethod.call(object1, object2)
И в результате вы получите собственное слияние без обхода.
Возможное, субоптимальное решение
Если вы можете использовать свойство constructor
для Object
, а затем принудить один объект к созданию конструктора другого объекта, а затем запустить new
над составным объектом, вы можете получить слияние бесплатно. Но у меня нет четкого понимания всех последствий функции constructor
в javascript для выполнения этого вызова.
Лемма
Тот же вопрос справедлив для Arrays
. Общая проблема состоит в том, чтобы взять, например, 7 массивов чисел, а затем попытаться выяснить пересечение этих массивов. То есть, какие числа существуют во всех 7 массивах.
Вы могли бы объединить их вместе, затем сделать вид, а затем сделать обход, конечно. Но было бы неплохо, если бы где-то было пересечено какое-то общее пересечение, которое мы можем принудить массив к выполнению изначально.
Любые мысли?
изменить:
На полпути туда
Для проблемы с массивом вы можете сделать следующее:
array.concat(a, b, c).sort(). join (':'), а затем используйте некоторые сложные шаблоны захвата и повтора RegExp
, чтобы пройти. Реализация RegExp, если вы не знаете, запускается на очень простой виртуальной машине на основе стека. Когда вы инициализируете свое регулярное выражение, которое действительно является компиляцией программы (RegExp.compile - это устаревший метод JS). Тогда нативный пробегает строку по-быстрому. Возможно, вы можете использовать это для порогов членства и получить лучшую производительность...
Он все еще не проходит весь путь.