如何在不更改属性数据类型的情况下推送对象数组
How can I push an array of objects, without changing the data type of the property?
function where(collection, source) {
var arr = [];
for (var p in collection) {
for (var x in source) {
if (collection[p].hasOwnProperty(x)) {
if (collection[p][x] === source[x]) {
arr.push(collection[p]);
break;
}
}
}
}
for (var i in arr) {
if (Object.keys(arr[i]).length < Object.keys(source).length) {
delete arr[i];
}
}
return arr;
}
where([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], {"a": 1, "b": 2 });
第一个循环中的 arr.push 将对象放入数组中,但更改属性,使它们不再是字符串 - 从"a":1 to a:1.
我需要属性周围的引号完好无损。
在寻找解决方案时,我遇到了一些信息,其中将对象推送到数组中,它只是引用对象本身,而不是直接将其复制到数组中。
这里有人有什么想法吗?感谢您的帮助。
Javascript 对象只接受字符串作为属性。
您可以通过在推送新对象后检查其类型来验证这一点。
Object.keys({ "a": 1, "b": 2 })
.map(prop => typeof prop);
// ["string", "string"]
控制台显示它们时不带引号,因为已经暗示它们是字符串。
ES2015引入了计算属性作为替代方法,但它们的语法明显不同。
var str = 'a';
var obj = { [a]: 1 };
也许在将对象推送到数组之前创建一个新的对象文字?
像...
if (collection[p][x] === source[x]) {
var foo = new Object;
// for all keys and values of collection[p]
foo[*collection[p] property as string*] = *collection[p] property value*
...
arr.push(foo);
break;
}
相关文章:
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 在不阻止默认行为的情况下检测IE10中的缩放
- 如何在不传递此信息的情况下查找被调用的元素
- 如何在不刷新页面的情况下更新显示框
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- JavaScript-在手机上不工作的情况下,在外部单击时隐藏元素
- 在我的情况下,如何进行http请求
- 在不知道深度或父属性的情况下从对象中删除属性
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- ROR:如何在不重新加载浏览器的情况下从控制器获取参数
- 如何在不影响其他元素的情况下扩展DIV
- 如何在内联依赖项并将图像转换为dataURI的情况下完全提取网页
- 在不移动内部文本的情况下缩放元素的效果
- 在不设置协议的情况下,使用javascript/jquery更改iframe-src
- 默认情况下折叠和展开嵌套列表
- 如何在不单击javascript中的按钮的情况下触发事件
- 我们如何在不更改url的情况下使用锚点点击从一个页面重定向到另一个页面