ฉันมีวัตถุ JS แบน:
{a: 1, b: 2, c: 3, ..., z:26}
ฉันต้องการโคลนวัตถุยกเว้นองค์ประกอบหนึ่ง:
{a: 1, c: 3, ..., z:26}
วิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร (เลือกที่จะใช้ es6 / 7 ถ้าเป็นไปได้)?
ฉันมีวัตถุ JS แบน:
{a: 1, b: 2, c: 3, ..., z:26}
ฉันต้องการโคลนวัตถุยกเว้นองค์ประกอบหนึ่ง:
{a: 1, c: 3, ..., z:26}
วิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร (เลือกที่จะใช้ es6 / 7 ถ้าเป็นไปได้)?
คำตอบ:
หากคุณใช้Babelคุณสามารถใช้ไวยากรณ์ต่อไปนี้เพื่อคัดลอกคุณสมบัติ b จาก x ไปยังตัวแปร b แล้วคัดลอกคุณสมบัติที่เหลือลงในตัวแปร y :
let x = {a: 1, b: 2, c: 3, z:26};
let {b, ...y} = x;
และมันจะถูกเปลี่ยนเป็น:
"use strict";
function _objectWithoutProperties(obj, keys) {
var target = {};
for (var i in obj) {
if (keys.indexOf(i) >= 0) continue;
if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;
target[i] = obj[i];
}
return target;
}
var x = { a: 1, b: 2, c: 3, z: 26 };
var b = x.b;
var y = _objectWithoutProperties(x, ["b"]);
let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
ignoreRestSiblings
ที่ถูกเพิ่มใน v3.15.0 (3 กุมภาพันธ์ 2017) ดู: กระทำ c59a0ba
b
ขอบเขต
var clone = Object.assign({}, {a: 1, b: 2, c: 3});
delete clone.b;
หรือถ้าคุณยอมรับคุณสมบัติที่จะไม่ได้กำหนด:
var clone = Object.assign({}, {a: 1, b: 2, c: 3}, {b: undefined});
หากต้องการเพิ่มคำตอบของ Ilya Palkin: คุณสามารถลบคีย์แบบไดนามิกได้:
const x = {a: 1, b: 2, c: 3, z:26};
const objectWithoutKey = (object, key) => {
const {[key]: deletedKey, ...otherKeys} = object;
return otherKeys;
}
console.log(objectWithoutKey(x, 'b')); // {a: 1, c: 3, z:26}
console.log(x); // {a: 1, b: 2, c: 3, z:26};
ที่มา:
_
ที่อนุญาตให้ใช้สำหรับตัวแปรที่คุณไม่ต้องการใช้
var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
สำหรับผู้ที่ไม่สามารถใช้ ES6 คุณสามารถใช้หรือlodash
underscore
_.omit(x, 'b')
ramda
หรือ
R.omit('b', x)
delete
ฉันต้องการข้อมูลนี้หากผมอ่านผ่านคำตอบและเหตุผลสำหรับการเพิ่มความคิดเห็นของฉันและการกล่าวขวัญ
ฉันใช้ ESNext หนึ่งไลเนอร์นี้
const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = (({ b, c, ...o }) => o)(obj) // remove b and c
console.log(clone)
หากคุณต้องการฟังก์ชั่นวัตถุประสงค์ทั่วไป:
function omit(obj, props) {
props = props instanceof Array ? props : [props]
return eval(`(({${props.join(',')}, ...o}) => o)(obj)`)
}
// usage
const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = omit(obj, ['b', 'c'])
console.log(clone)
map
คุณสามารถทำได้:(({b, c, ...others}) => ({...others}))(obj)
คุณสามารถเขียนฟังก์ชันตัวช่วยอย่างง่ายได้ Lodash มีฟังก์ชั่นที่คล้ายกันที่มีชื่อเดียวกัน: งด
function omit(obj, omitKey) {
return Object.keys(obj).reduce((result, key) => {
if(key !== omitKey) {
result[key] = obj[key];
}
return result;
}, {});
}
omit({a: 1, b: 2, c: 3}, 'c') // {a: 1, b: 2}
นอกจากนี้โปรดทราบว่ามันเร็วกว่า Object.assign และลบแล้ว: http://jsperf.com/omit-key
อาจจะเป็นสิ่งนี้:
var copy = Object.assign({}, {a: 1, b: 2, c: 3})
delete copy.c;
ดีพอหรือไม่ หรือไม่สามารถc
คัดลอกได้จริงเหรอ?
ใช้การทำลายวัตถุ
const omit = (prop, { [prop]: _, ...rest }) => rest;
const obj = { a: 1, b: 2, c: 3 };
const objWithoutA = omit('a', obj);
console.log(objWithoutA); // {b: 2, c: 3}
_
ไม่ได้ช่วยแก้ปัญหาสำหรับ ESLint ...
เฮ้ดูเหมือนว่าคุณจะพบปัญหาการอ้างอิงเมื่อคุณพยายามที่จะคัดลอกวัตถุแล้วลบคุณสมบัติ บางแห่งคุณต้องกำหนดตัวแปรดั้งเดิมเพื่อให้จาวาสคริปต์ทำให้ค่าใหม่
เคล็ดลับง่าย ๆ (อาจจะน่ากลัว) ฉันเคยเป็นแบบนี้
var obj = {"key1":"value1","key2":"value2","key3":"value3"};
// assign it as a new variable for javascript to cache
var copy = JSON.stringify(obj);
// reconstitute as an object
copy = JSON.parse(copy);
// now you can safely run delete on the copy with completely new values
delete copy.key2
console.log(obj)
// output: {key1: "value1", key2: "value2", key3: "value3"}
console.log(copy)
// output: {key1: "value1", key3: "value3"}
JSON.parse(JSON.stringify(Object.assign({}, obj, { key2: undefined })));
สามารถทำ ไม่จำเป็นต้องลบเลยเพียงแค่ต้องการค่าที่ผิดพลาด
นี่คือตัวเลือกสำหรับการละเว้นคีย์แบบไดนามิกที่ฉันเชื่อว่ายังไม่ได้กล่าวถึง:
const obj = { 1: 1, 2: 2, 3: 3, 4: 4 };
const removeMe = 1;
const { [removeMe]: removedKey, ...newObj } = obj;
removeMe
มีนามแฝงเป็นremovedKey
และละเว้น จะกลายเป็นnewObj
{ 2: 2, 3: 3, 4: 4 }
โปรดทราบว่าไม่มีคีย์ที่ถูกลบออกค่าไม่ได้ถูกตั้งค่าเป็นundefined
เท่านั้น
วิธีที่ง่ายที่สุด
const allAlphabets = {a: 1, b: 2, c: 3, ..., z:26};
const { b, ...allExceptOne } = allAlphabets;
console.log(allExceptOne); // {a: 1, c: 3, ..., z:26}
Lodash ละเว้น
let source = //{a: 1, b: 2, c: 3, ..., z:26}
let copySansProperty = _.omit(source, 'b');
// {a: 1, c: 3, ..., z:26}
คุณยังสามารถใช้ตัวดำเนินการแพร่กระจายเพื่อทำสิ่งนี้
const source = { a: 1, b: 2, c: 3, z: 26 }
const copy = { ...source, ...{ b: undefined } } // { a: 1, c: 3, z: 26 }
copy
const copy = { ...source, b: undefined }
เดือดลงไปเหมือนกันทุกประการ
การแก้ปัญหาข้างต้นโดยใช้โครงสร้างจะประสบกับความจริงที่ว่าคุณมีตัวแปรที่ใช้แล้วซึ่งอาจทำให้เกิดการร้องเรียนจาก ESLint หากคุณใช้สิ่งนั้น
ดังนั้นนี่คือคำตอบของฉัน:
const src = { a: 1, b: 2 }
const result = Object.keys(src)
.reduce((acc, k) => k === 'b' ? acc : { ...acc, [k]: src[k] }, {})
บนแพลตฟอร์มส่วนใหญ่ (ยกเว้น IE ยกเว้นการใช้ Babel) คุณสามารถทำได้:
const src = { a: 1, b: 2 }
const result = Object.fromEntries(
Object.entries(src).filter(k => k !== 'b'))
เกี่ยวกับสิ่งนี้:
let clone = Object.assign({}, value);
delete clone.unwantedKey;
หากคุณกำลังเผชิญกับตัวแปรขนาดใหญ่คุณไม่ต้องการคัดลอกแล้วลบทิ้งเนื่องจากจะไม่มีประสิทธิภาพ
การวนรอบอย่างง่ายพร้อมกับการตรวจสอบ hasOwnProperty ควรใช้งานได้และสามารถปรับให้เข้ากับความต้องการในอนาคตได้มากขึ้น:
for(var key in someObject) {
if(someObject.hasOwnProperty(key) && key != 'undesiredkey') {
copyOfObject[key] = someObject[key];
}
}
แล้วเรื่องนี้ล่ะ ฉันไม่เคยพบลายนี้มาก่อน แต่ฉันพยายามแยกคุณสมบัติอย่างน้อยหนึ่งอย่างโดยไม่จำเป็นต้องสร้างวัตถุเพิ่มเติม ดูเหมือนว่าจะทำงาน แต่มีผลข้างเคียงบางอย่างที่ฉันไม่สามารถมองเห็นได้ แน่นอนว่าอ่านไม่ได้
const postData = {
token: 'secret-token',
publicKey: 'public is safe',
somethingElse: true,
};
const a = {
...(({token, ...rest} = postData) => (rest))(),
}
/**
a: {
publicKey: 'public is safe',
somethingElse: true,
}
*/
ฉันทำแบบนี้เป็นตัวอย่างจาก Redux reducer ของฉัน:
const clone = { ...state };
delete clone[action.id];
return clone;
ในคำอื่น ๆ :
const clone = { ...originalObject } // note: original object is not altered
delete clone[unwantedKey] // or use clone.unwantedKey or any other applicable syntax
return clone // the original object without the unwanted key
const { [removeMe]: removedKey, ...newObj } = obj;
- ดูคำตอบของฉันสำหรับคำถามนี้
ฉันเพิ่งทำมันเป็นวิธีที่ง่ายมาก:
const obj = {a: 1, b: 2, ..., z:26};
เพียงใช้ตัวดำเนินการสเปรดเพื่อแยกคุณสมบัติที่ไม่ต้องการ:
const {b, ...rest} = obj;
... และobject.assignเฉพาะส่วนที่เหลือ:
const newObj = Object.assign({}, {...rest});
rest
เป็นวัตถุใหม่อยู่แล้ว - คุณไม่ต้องการบรรทัดสุดท้าย นอกจากนี้ยังเหมือนกับโซลูชันที่ยอมรับได้
const x = {obj1: 1, pass: 2, obj2: 3, obj3:26};
const objectWithoutKey = (object, key) => {
const {[key]: deletedKey, ...otherKeys} = object;
return otherKeys;
}
console.log(objectWithoutKey(x, 'pass'));