2015-03-06 3 views
0

мне интересно, если что-то, как это возможно - степени, что смотрит на массив объектовГлубоко расширяться, расширяться в массив объектов?

Допустим, у меня есть:

myObj = [ 
    {"name" : "one", "test" : ["1","2"]}, 
    {"name" : "two", "test" : ["1","2"]} 
    ] 

И я пытаюсь расширить в том, что

{"name" : "one" , "test" : ["1","3"]} 

Так что результат будет -

myObj = [ 
    {"name" : "one", "test" : ["1","2", "3"]}, 
    {"name" : "two", "test" : ["1","2"]} 
    ] 

И это будет похоже на то, что если там нет объекта, он просто создал бы один. Что-то вроде этого возможно? Благодаря!

+0

с ваниль JavaScript? Или с библиотекой? – Jamiec

+0

Почему объединение '[ "1", "2"] и' [ "1", "3"] 'стал' [ "1", «2», «3»] '? Как должен быть окончательный порядок в произвольном случае? – Oriol

+0

@jamiec, либо или, у меня есть знак подчеркивания прямо сейчас, но я не придирчивый – ajmajmajma

ответ

2

Похоже, что вы хотите что-то вроде:

function deepSetMerge(base, next) { 
 
    var dataEntry = base.filter(function(it) { 
 
    return it.name === next.name; 
 
    })[0]; 
 

 
    if (dataEntry) { 
 
    var diff = next.test.filter(function(it) { 
 
     return dataEntry.test.indexOf(it) === -1; 
 
    }); 
 
    dataEntry.test = dataEntry.test.concat(diff).sort(); 
 
    } else { 
 
    base.push(next); 
 
    } 
 
} 
 

 
var data = [{ 
 
    "name": "one", 
 
    "test": ["1", "2"] 
 
}, { 
 
    "name": "two", 
 
    "test": ["1", "2"] 
 
}]; 
 

 
var add = { 
 
    "name": "one", 
 
    "test": ["1", "3"] 
 
}; 
 

 
var obj = { 
 
    "name": "totally-unique", 
 
    "test": [1, 2, "nine", 17.0] 
 
}; 
 

 
deepSetMerge(data, add); 
 
deepSetMerge(data, obj); 
 

 
document.getElementById('results').textContent = JSON.stringify(data);
<pre id="results"></pre>

Эта функция работает, находя существующую запись, по имени, если таковой существует. Если нет, мы просто подталкиваем объект к объединению в качестве новой записи.

Если запись существует, найдите разницу между двумя наборами элементов, а затем соедините их с концом существующего массива (и отсортируйте результаты).

Это довольно специфично для вашей структуры данных, а не для самого гибкого решения в мире, но, надеюсь, хорошо показывает алгоритм.

+0

Ах, потрясающе! обрабатывает ли это случай использования, когда я пытаюсь добавить совершенно новый объект? например, если я попытался добавить {name: 5, test [4,6]}? Благодаря! – ajmajmajma

+0

@ajmajmajma yep, добавил пример этого. – ssube

+0

Спасибо, это здорово !! – ajmajmajma

1

В качестве универсального решения реализация будет довольно сложной и дорогостоящей. Именно поэтому глубокие погружения обычно избегают. Лучше знать вашу модель данных и работать с ней таким образом.

Используя ваш пример, я бы установить некоторые предположения о модели данных в вопросе:

  1. Наш объект будет иметь name свойство, которое является уникальным и может быть искали.
  2. Значение test собственности является массивом (делает это проще, но это может быть объект, который вы используете типичный расширить реализацию на

В этом случае вы могли бы подойти к нему так:.

var myObj = [ 
    {name: 'one', test: ['1', '2']}, 
    {name: 'two', test: ['1', '2']} 
]; 

function extendTestValue(data, value) { 
    var names = data.map(function(item) { 
    return item.name; 
    }); 
    var index = names.indexOf(value.name); 
    if (index < 0) { 
    data.push(value); 
    } else { 
    value.test.forEach(function(item) { 
     if (data[index].test.indexOf(item) < 0) { 
     data[index].test.push(item); 
     } 
    }); 
    } 
    return data; 
} 
Смежные вопросы