从数组中的嵌套对象中删除对象 属性
Remove object property from the nested object in the array
我有以下书籍。我想要一个函数来接收目标书和语言,从嵌套对象中删除那本书(键,值)和 returns 新数组。
let books = [
{
language: 'spanish',
books: {
book_1: 'book1_spanish',
book_2: 'book2_spanish',
book_3: 'book3_spanish'
}
},
{
language: 'italian',
books: {
book_1: 'book1_italian',
book_2: 'book2_italian',
book_3: 'book3_italian'
}
}
];
let targetBook = { book_1: 'book1_spanish' };
let language = 'spanish';
我卡在循环嵌套对象上了。
function removeTargetBook(lan, target) {
return books.map(book => {
if (book.language == lan) {
Object.values(book).map(value => {});
}
});
}
它应该 return 没有 book_1 的同一个数组:'book1_spanish'。
这是我的 stackblitz:https://stackblitz.com/edit/js-yxcrbq
谢谢。
我觉得这样的东西应该行得通
function removeTargetBook(lan, target) {
books.some(book => {
if (book.language == lan) {
delete book.books[Object.keys(target)[0]];
return true;
}
});
return books
}
我的版本太复杂了:
let books = [{
language: 'spanish',
books: {
book_1: 'book1_spanish',
book_2: 'book2_spanish',
book_3: 'book3_spanish'
}
},
{
language: 'italian',
books: {
book_1: 'book1_italian',
book_2: 'book2_italian',
book_3: 'book3_italian'
}
}
];
let targetBook = {
book_1: 'book1_spanish'
};
let language = 'spanish';
function removeTargetBook(lan, target) {
return books.map(book => {
if (book.language === lan) {
return {
language: book.language,
books: Object.assign(...Object.keys(book.books).map((key) => ({
[key]: book.books[key]
})).filter((e) => (Object.keys(e)[0] !== Object.keys(target)[0]) && Object.values(e)[0] !== Object.values(target)[0])),
}
} else {
return book
}
})
}
console.log(removeTargetBook(language, targetBook))
您想使用 delete 运算符。
我冒昧地稍微扩展了您的代码,以向您展示如何在 forEach
循环中使用对象的 key
比进行键/值对比较更有效。另请注意,我完整地保留了原始 books
对象,这对于单元可测试代码和数据完整性很重要,但您可以根据需要 change/implement。
let books = [
{
language: 'spanish',
books: {
book_1: 'book1_spanish',
book_2: 'book2_spanish',
book_3: 'book3_spanish'
}
},
{
language: 'italian',
books: {
book_1: 'book1_italian',
book_2: 'book2_italian',
book_3: 'book3_italian'
}
}
];
let targetBook = { book_1: 'book1_spanish' };
let language = 'spanish';
let target = Object.keys(targetBook)[0]; // we only need the 'key' of the targetBook
let result;
function removeTargetBook(books, lan, target) {
books.forEach(elem => { // some instead of forEach works here as well
elem.language === lan && (delete elem.books[target]);
});
return books;
}
// multiple tests for correctness
result = removeTargetBook(books, language, 'fool proof test');
console.log(result);
result = removeTargetBook(books, language, target);
console.log(result);
result = removeTargetBook(books, language, 'book_2');
console.log(result);
result = removeTargetBook(books, language, 'book_3');
console.log(result);
我有以下书籍。我想要一个函数来接收目标书和语言,从嵌套对象中删除那本书(键,值)和 returns 新数组。
let books = [
{
language: 'spanish',
books: {
book_1: 'book1_spanish',
book_2: 'book2_spanish',
book_3: 'book3_spanish'
}
},
{
language: 'italian',
books: {
book_1: 'book1_italian',
book_2: 'book2_italian',
book_3: 'book3_italian'
}
}
];
let targetBook = { book_1: 'book1_spanish' };
let language = 'spanish';
我卡在循环嵌套对象上了。
function removeTargetBook(lan, target) {
return books.map(book => {
if (book.language == lan) {
Object.values(book).map(value => {});
}
});
}
它应该 return 没有 book_1 的同一个数组:'book1_spanish'。 这是我的 stackblitz:https://stackblitz.com/edit/js-yxcrbq
谢谢。
我觉得这样的东西应该行得通
function removeTargetBook(lan, target) {
books.some(book => {
if (book.language == lan) {
delete book.books[Object.keys(target)[0]];
return true;
}
});
return books
}
我的版本太复杂了:
let books = [{
language: 'spanish',
books: {
book_1: 'book1_spanish',
book_2: 'book2_spanish',
book_3: 'book3_spanish'
}
},
{
language: 'italian',
books: {
book_1: 'book1_italian',
book_2: 'book2_italian',
book_3: 'book3_italian'
}
}
];
let targetBook = {
book_1: 'book1_spanish'
};
let language = 'spanish';
function removeTargetBook(lan, target) {
return books.map(book => {
if (book.language === lan) {
return {
language: book.language,
books: Object.assign(...Object.keys(book.books).map((key) => ({
[key]: book.books[key]
})).filter((e) => (Object.keys(e)[0] !== Object.keys(target)[0]) && Object.values(e)[0] !== Object.values(target)[0])),
}
} else {
return book
}
})
}
console.log(removeTargetBook(language, targetBook))
您想使用 delete 运算符。
我冒昧地稍微扩展了您的代码,以向您展示如何在 forEach
循环中使用对象的 key
比进行键/值对比较更有效。另请注意,我完整地保留了原始 books
对象,这对于单元可测试代码和数据完整性很重要,但您可以根据需要 change/implement。
let books = [
{
language: 'spanish',
books: {
book_1: 'book1_spanish',
book_2: 'book2_spanish',
book_3: 'book3_spanish'
}
},
{
language: 'italian',
books: {
book_1: 'book1_italian',
book_2: 'book2_italian',
book_3: 'book3_italian'
}
}
];
let targetBook = { book_1: 'book1_spanish' };
let language = 'spanish';
let target = Object.keys(targetBook)[0]; // we only need the 'key' of the targetBook
let result;
function removeTargetBook(books, lan, target) {
books.forEach(elem => { // some instead of forEach works here as well
elem.language === lan && (delete elem.books[target]);
});
return books;
}
// multiple tests for correctness
result = removeTargetBook(books, language, 'fool proof test');
console.log(result);
result = removeTargetBook(books, language, target);
console.log(result);
result = removeTargetBook(books, language, 'book_2');
console.log(result);
result = removeTargetBook(books, language, 'book_3');
console.log(result);