如何获取对象,将其设置为与来自另一个对象的属性相匹配的预定值的特定属性?

时间:2018-08-08 18:14:52

标签: javascript object javascript-objects

***我修改了上面的问题,以便根据我的问题的意图和在这种代码模式中可能出现的混淆/误解,使它更有意义。

我要总体上实现的目标是能够创建一个对象(从空开始)并将其设置为具有属性名称的对象,同时将该属性名称设置为另一个对象的值的能力。

这将允许我做的是创建一个对象,该对象将具有一个属性,该属性包含一个具有属性的对象,该属性之一是键,该值的值将是属性的名称。新对象设置为的属性。

我为什么需要这个或想要这个新对象...

此模式的目的(我看到该模式的用途)是获取设置为接口/名称的对象,其中设置为包含属性的对象与值之一相同在所引用属性的值中。这听起来令人困惑,所以我创建了一个jsbin来说明针对我所要求的解决方案...如果其他人对我的问题有更好的解释或标题,请告知。

我与代码示例一起提供的答案是我所要求的并通过我的理解获得的。

------上一个问题--------

我的问题是,为什么或何时应该决定采用对象属性并将其设置为另一个对象。对我来说,似乎继承“设置”是原因,但我不确定100%。此外,我不确定何时应该考虑这个问题以及在什么情况下应该决定使用这种模式。

我可以阅读并遵循代码,但是我最困惑和最关心的问题是object [property] = otherObject;

也许这与Object.assign()构造有关?我所知道的是,我已经几次这样做,有些困惑,因为为什么以及何时应该知道使用这种模式。不过,这里可能还有其他我想念的地方。

这是我引用的代码示例。

constructor(props) {
super(props);
this.state = {
  completedAssets : 0,
  totalAssets : 0,
  currentDownloads: {},
  logs: []
};
}

let currDownloadObject = {
  fileName: fileName,
  currentSize: loaded,
  totalSize: total,
  complete: (loaded === total),
  completeOrder : fileCompleteOrder,
  order: (file) ? file.order : Object.keys(this.state.currentDownloads).length + 1
}

let currentDownloadStateArray = Object.assign({},this.state.currentDownloads);

currentDownloadStateArray[fileName] = currDownloadObject;

this.setState({currentDownloads: currentDownloadStateArray});

这是我最困惑的输出示例。

运行此日志语句时:

console.log('currentDownloadStateArray ', currentDownloadStateArray);

我得到了以下示例的退货:

https://navigation/az.png: {fileName: "https://navigation/az.png", currentSize: 7451, totalSize: 7451, complete: true, completeOrder: 1, …}
https://navigation/destination.png: {fileName: "https://avigation/destination.png", currentSize: 8322, totalSize: 8322, complete: true, completeOrder: 2, …}

因此,实际上,现在将currentDownloadStateArray设置为具有每个fileName属性的接口的对象。 <<<为什么会这样,它的作用是什么

1 个答案:

答案 0 :(得分:0)

要创建一个由另一个包含该对象的对象设置为值的新对象,请执行以下操作。

let state = {
  iteratedFoo: {} // this is a dictionary of dictionaried objects... an object which is a collection of objects.
};

let currentDownloadState = (someValue, anotherValue, urlName) => {

let bar = {
  fileName: urlName,
  someProp: someValue,
  anotherProp: anotherValue
}

let foo = Object.assign({}, state['iteratedFoo'] )

// console.log('foo[urlName] = ', foo[urlName]); // undefined because it wasn't set yet on first loop

foo[urlName] = bar;

console.log('bar ', bar);
console.log('foo ', foo);
console.log('foo[urlName] = ', foo[urlName]);

state['iteratedFoo'] = foo;

console.log('state["iteratedFoo"] ', state['iteratedFoo']);
}

currentDownloadState('this value', 'another value', 'www.msn.com');
currentDownloadState('this value', 'another value', 'www.espn.com');
currentDownloadState('this value', 'another value', 'www.theverge.com');

随着该函数的重复,iteratedFoo对象创建一个对象,该对象是foo对象的集合,该对象包含一个属性名称,该属性名称包含一个具有属性值的值,其中一个属性是foo属性名的值...在这种情况下foo [urlName]

http://jsbin.com/linebap/1/edit?js,console

此目的和用例最终将创建由所述引用对象的属性值引用的对象的集合。

生成的state.iteratedFoo对象现在看起来像这样...

"state[\"iteratedFoo\"] "
[object Object] {
 www.espn.com: [object Object] {
    anotherProp: "another value",
    fileName: "www.espn.com",
    someProp: "this value"
  },
  www.msn.com: [object Object] {
    anotherProp: "another value",
    fileName: "www.msn.com",
    someProp: "this value"
  },
 www.theverge.com: [object Object] {
    anotherProp: "another value",
    fileName: "www.theverge.com",
    someProp: "this value"
  }
}