Объект 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). Тогда нативный пробегает строку по-быстрому. Возможно, вы можете использовать это для порогов членства и получить лучшую производительность...
Он все еще не проходит весь путь.