首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并JS中的两个对象并根据单个输入选择多个值

合并JS中的两个对象并根据单个输入选择多个值
EN

Stack Overflow用户
提问于 2020-01-06 14:30:36
回答 2查看 185关注 0票数 1

问题:

我希望将两个对象合并在一起,并根据整数输入选择多个值。更具体地说,我希望基于整数输入为<img>元素分配图像源和alt。

代码:

JS对象#1

代码语言:javascript
复制
const sources = {
  1: "assets/images/newyorktimes.png",
  2: "assets/images/cnn.png",
  3: "assets/images/bbc.png",
  4: "assets/images/washingtonpost.png"
};

JS对象#2

代码语言:javascript
复制
const sourcenames = {
  1: "New York Times",
  2: "CNN",
  3: "BBC",
  4: "Washington Post"
};

输入值:

我从一个参数中获得输入值,我用以下方式解构该参数:

代码语言:javascript
复制
const { 
  fictionsource: fictionSrc,  // INPUT HERE (e.g., 1)
  content: contentSrc         // CONTENT HERE
} = stimulus;

我以下列方式分配内容:

代码语言:javascript
复制
const newsContent = node.querySelector(".js-news-content");
newsContent.innerHTML = contentSrc;

现在,我希望根据输入值分配图像源和alt文本.例如,如果值为1,那么我希望发生以下情况:

代码语言:javascript
复制
const newsImage = node.querySelector(".js-news-image img");
// Assign assets/images/newyorktimes.png to src-attribute
// Assign New York Times to alt-attribute

期望输出:

推荐的方法是结合这两个对象,并根据输入值分配图像源和alt文本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-06 15:10:12

你需要这样的东西:

代码语言:javascript
复制
// In principle is better to have 
// empty objects.
const sources = Object.assign(Object.create(null),{
  1: "assets/images/newyorktimes.png",
  2: "assets/images/cnn.png",
  3: "assets/images/bbc.png",
  4: "assets/images/washingtonpost.png"
});

const sourcenames = Object.assign(Object.create(null),{
  1: "New York Times",
  2: "CNN",
  3: "BBC",
  4: "Washington Post"
});

// Here we hardcode 
// the case when fictionsource 
// is equal to 1. 
const stimulus = {
  fictionsource: 1,
  content: "<div>test</div>"
}

const { 
  fictionsource: fictionSrc,  // INPUT HERE (e.g., 1)
  content: contentSrc         // CONTENT HERE
} = stimulus;


const newsImage = node.querySelector(".js-news-image img");

if (newsImage && typeof sources[fictionSrc] !== 'undefined' && typeof sourcenames[fictionSrc] !== undefined) {
   newsImage.setAttribute("src", sources[fictionSrc]);
   newsImage.setAttribute("alt", sourcenames[fictionSrc]);
} else {
    throw new Error("Incorrect data");
}

这就是如何将对象“合并”在一起的方法:

代码语言:javascript
复制
const sources = {
  1: "assets/images/newyorktimes.png",
  2: "assets/images/cnn.png",
  3: "assets/images/bbc.png",
  4: "assets/images/washingtonpost.png"
};

const sourcenames = {
  1: "New York Times",
  2: "CNN",
  3: "BBC",
  4: "Washington Post"
};

const result = {}

Object.keys(sources).forEach((x) => {
    result[sources[x]] = sourcenames[x];
});

console.log(result);

还有一个更好的主意:

代码语言:javascript
复制
const sources = {
  1: "assets/images/newyorktimes.png",
  2: "assets/images/cnn.png",
  3: "assets/images/bbc.png",
  4: "assets/images/washingtonpost.png"
};

const sourcenames = {
  1: "New York Times",
  2: "CNN",
  3: "BBC",
  4: "Washington Post"
};

const result = Object.keys(sources).reduce((acc, value) => {
    acc[sources[value]] = sourcenames[value];
    return acc;
},Object.create(null));

console.log(result);

如果您希望保留索引并让嵌套对象检查此示例:

代码语言:javascript
复制
const sources = Object.assign(Object.create(null), {
    1: "assets/images/newyorktimes.png",
    2: "assets/images/cnn.png",
    3: "assets/images/bbc.png",
    4: "assets/images/washingtonpost.png"
});

const sourcenames = Object.assign(Object.create(null),{
    1: "New York Times",
    2: "CNN",
    3: "BBC",
    4: "Washington Post"
});

const result = Object.keys(sources).
filter((key) => typeof sourcenames[key] !== 'undefined').
reduce((acc, value) => {
    acc[value] = Object.assign(Object.create(null), {
        source: sources[value],
        sourcename: sourcenames[value]
    });
    return acc;
},Object.create(null));

console.log(result);

编辑:如果您使用数组而不是对象,则缺点是对元素的访问速度有点慢。您需要在数组中搜索相应的元素。这是在没有数组索引的情况下使用的。

票数 1
EN

Stack Overflow用户

发布于 2020-01-06 14:57:08

您可以像这样循环遍历对象:

代码语言:javascript
复制
let source = null
for(var key in sources){
     if ( value == key ) // value is the number you are looking for
           sources = sources.key
}
newsImage.src = source

但是,如果您的对象是数组,那么您可以直接访问它:

代码语言:javascript
复制
sources = ["assets/images/newyorktimes.png", "assets/images/cnn.png", "assets/images/bbc.png", "assets/images/washingtonpost.png" ]
newsImage.src = sources[value]

希望能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59613860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档