#javascript #arrays #object
#javascript #массивы #объект
Вопрос:
У меня есть 2 массива:
var alleditvals= {username: "twooooo", password: "two_p", address: "two_add"};
var a= {username: "two", password: "two_p", address: "two_add"};
Теперь я хочу, чтобы только разница (т. Е. «twoooo») была заменена на объект, a
такой, который a
также становится похожим alleditvals
.
На самом деле в моем коде a
происходит из массива с именем add_data
, поэтому я использую map
функцию:
add_data.map((a,i)=>
i===count_edit ? alleditvals : a
)
здесь count_edit
это просто число, которое я обновляю, а затем я проверяю, add_data
совпадает count_edit
ли индекс alleditvals
, затем включаю значение add_data
, иначе сохраняю a
значение (которое есть). Но проблема с этим методом заключается в том, что он заменяет каждый объект внутри add_data
если условие выполняется, я имею в виду, что такие поля, как password
и address
, также заменяются. поэтому, пожалуйста, предложите метод, при котором я могу выборочно заменить только тот элемент, в котором произошло изменение.
Спасибо.
Комментарии:
1. У вас есть список всех свойств, которые необходимо заменить, или свойств, которые следует исключить?
2. Во-первых, это не массивы. Во-вторых, если вам нужно
a
равнятьсяalleditvals
, почему бы не назначить его?a = alleditvals
?3. @Kraylog Он сказал, что не хочет заменять свойства пароля и адреса.
4. @Barmar xyproblem.info
5. Я не понимаю, я могу выборочно заменить только тот элемент, в котором произошло изменение. Если вы замените свойства, в которых не произошло никаких изменений, в чем разница? Это все то же самое.
Ответ №1:
Если я вас правильно понимаю, вы не хотите, чтобы a равнялся alleditvals, потому что, как сказал Крайлог, в этом случае вы могли бы просто назначить его (за исключением того факта, что тогда все свойства, которые были в a, но не в alleditvals, были бы потеряны)
Что вы можете захотеть сделать, так это просмотреть свойства вашего данного объекта и скопировать только те поля, которые соответствуют вашим критериям, например:
for (x in alleditvals) {
if (x === “username”) {
a[x] = alleditvals[x];
}
// more if x === ... stuff
}
Чтобы действительно выполнить то, что вы просили (перезаписать различия и сохранить свойства a, которые не встречаются во alleditvals), попробуйте что-то вроде:
for (x in alleditvals) {
if (
a.hasOwnProperty(x) // to only replace if a contains a key of alleditvals
amp;amp; a[x] !== alleditvals[x]
) {
a[x] = alleditvals[x];
}
}
Ответ №2:
Используйте Object.assign
.
var alleditvals= {username: "twooooo", password: "two_p", address: "two_add"};
var a= {username: "two", password: "two_p", address: "two_add"};
a = Object.assign(a, alleditvals);
Ответ №3:
Если я правильно понял ваш вопрос, это может быть хорошим подходом к тому, что вы ищете:
var alleditvals= {username: "twooooo", password: "two_p", address: "two_add"};
var a= {username: "two", password: "two_p", address: "two_add"};
var b= {username: "three", password: "two_p", address: "two_add"};
var c= {username: "four", password: "two_p", address: "two_add"};
let add_data=[a,b,c];
for (let x in add_data) {
if(add_data[x].username!==alleditvals.username){
add_data[x].username=alleditvals.username
}
/* other fields is same:
if(add_data[x].password!==alleditvals.password){
add_data[x].password=alleditvals.password
}
*/
}
console.log(add_data)
Вы можете изменить и запустить этот код отсюда.
Ответ №4:
Если вы используете современный javascript, вы можете достичь этого просто с помощью оператора распространения:
a = { ...alleditvals, ...a }
Теперь a
будут все исходные свойства a
плюс любые из alleditvals
, которые еще не определены a
.
Если вместо этого вы хотели, чтобы оба новых значения из alleditvals
и заменяли что-либо в a
на то же значение prop из alleditvals
— т. Е. Слияние a
— тогда просто измените порядок:
a = { ...a, ...alleditvals }