Объект 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)
Этот подход использует существующий нативный код и поэтому менее восприимчив к глупости программиста и должен выполнятьсябыстрее, чем неродная реализация.
Вопрос
Есть ли хитрость в использовании этого прототипа / шаблона вызова, возможно, для функций обхода Attribute
или Node
DOM, иливозможно, некоторые из общих String
функций для слияния нативных объектов?
Код будет выглядеть примерно так:
var merged = somethingrandom.obscuremethod.call(object1, object2)
И в результате вы получите нативное слияние без обхода.
Возможное, неоптимальное решение
Если бы вы могли использовать свойство constructor
Object
, а затем заставить один объект создать конструктор другого объекта, а затем запустить new
над составным объектомВы можете получить слияние бесплатно.Но у меня нет четкого понимания всех последствий использования функции constructor
в javascript для выполнения этого вызова.
Лемма
Тот же вопрос справедлив для Arrays
.Общая проблема состоит в том, чтобы взять, скажем, 7 массивов чисел, а затем попытаться выяснить пересечение этих массивов.То есть, какие числа существуют во всех 7 массивах.
Вы можете объединить их вместе, затем выполнить сортировку, а затем, конечно, выполнить обход.Но было бы неплохо, если бы где-нибудь было спрятано общее пересечение, которое мы могли бы принудительно заставить массив выполнять.
Есть мысли?
edit:
На полпутиТам
Для решения проблемы с массивом вы можете сделать следующее:
array.concat (a, b, c) .sort (). join (':') и затем использовать некоторые хитрыеRegExp
захват и повторение паттернов для прохождения.Реализации RegExp, если вы не знаете, работают на очень простой виртуальной машине, основанной на стеке.Когда вы инициализируете свое регулярное выражение, это действительно программа, которая компилируется (RegExp.compile является устаревшим методом JS).Затем натив перебегает через струну невероятно быстро.Возможно, вы могли бы использовать это для порогов членства и получить лучшую производительность ...
Это все еще не проходит весь путь.