我如何获得 Javascript 中关联数组和常规数组之间的区别
How do I get the difference between an associative array and a regular array in Javascript?
是否可以在Javascript中得到关联数组和常规数组的区别?
前任。
array1 = [5, 1, 3];
array2 = [1 => 15, 2 => 20, 3 => 10, 4 => 5, 5 =>50 ];
区别将是...
diff = [2 => 20, 4=> 5];
我假设你的问题只是在你的array2
声明中有一个小错别字. 这没什么大不了的。
无论如何,这里有一点技巧,但它给了你想要的:
array1 = [5, 1, 3];
array2 = {1: 15, 2: 20, 3: 10, 4: 5, 5: 50};
var result = {};
for (var i in array2) {
if (array1.indexOf(+i) < 0) {
result[i] = array2[i];
}
}
alert(JSON.stringify(result));
工作示例
我的黑客是indexOf
调用中的+i
,因为"关联数组"的属性是字符串,但您的array1
包含数字。 一元+
从字符串生成一个数字。 有点黑客,但它是公认的JavaScript实践的惯用语。
补遗
正如 RobG 指出的那样,indexOf
是一种 ES5 方法,所以如果你的 JavaScript 引擎是 ES3 或更低版本,你需要自己实现indexOf
。 如何做到这一点的一个例子是在MDN。或者,您可以通过自己搜索数组来执行等效的indexOf
。
首先,你的第二个数组应该是一个对象,而不是有效的JavaScript,正如前两位评论者所说。这里是对象形式:
var object = { "1": 15, "2": 20, "3": 10, "4": 5, "5": 50 };
此功能可实现您想要的结果:
function findDiff(arr, obj)
{
var tempObj = clone(obj);
for (var i = 0; i < arr.length; i++)
{
var propId = arr[i];
if (tempObj[propId] !== undefined)
delete tempObj[propId];
}
return tempObj;
}
这个函数依赖于一个名为clone
的函数,它确保obj
被复制到tempObj
值而不是引用。这可以防止传递的对象被修改:
function clone(obj){
if(obj == null || typeof(obj) != 'object')
return obj;
var temp = obj.constructor(); // changed
for(var key in obj)
temp[key] = clone(obj[key]);
return temp;
}
就这样称呼它:
var array = [5, 1, 3];
var object = { "1": 15, "2": 20, "3": 10, "4": 5, "5": 50 };
var diff = findDiff(array, object);
您需要详细解释您期望的操作结果是什么。
一种解释是根据另一个数组中的值从一个数组中删除成员,如下所示:
array1 = [5, 1, 3];
array2 = [15, 20, 10, 5, 50 ];
您可能有一个函数:
function diff(arr1, arr2) {
// Copy arrays so don't affect originals
var t1 = arr1.slice();
var t2 = arr2.slice();
// sort t1
t1.sort();
// Remove members of arr2 from highest indexes to lowest
var i = t1.length;
while (i--) {
t2.splice(t1[i], 1);
}
return t2;
}
alert(diff(array1, array2)); // 15, 10, 50
请注意,数组的索引为零,并且 array2 中没有第 5 个成员,因此删除的值为 20 和 5(即索引分别为 1 和 3 的成员(。
另一种选择是对变量执行JSON.stringify()
并检查结果字符串的最左侧或最右侧字符。如果是{
或}
,则有一个关联数组/对象,如果是[
或]
,则它是一个数组。我想这可能有点昂贵,具体取决于阵列的大小,但它可以完成这项工作。
然而......由于没有免费的午餐,而且所有的动物都是成对的,所以这只是一个合理的解决方案,如果你根据你的原始定义使用了你的变量。
如果你定义了一个对象,像这样:obj = [1,2,3]
,然后在稍后添加了一个值,例如obj['w'] = 'ww'
,一个JSON.stringify(obj)
只会产生[1,2,3]
,但如果你再次解决obj['w']
,你仍然会得到ww
,这意味着该值不会被遗忘,它们只是不混合。在内部,我想,javascript 保留了两个单独的变量表,一个用于对象,一个用于数组,无论哪个是第一个定义的,当打印 stringify 时都会得到点头。
更令人困惑的是,如果您先将变量定义为对象,然后添加一个数组键,又名
obj = {1: 11, 2: 22, 3: 33};
obj[4] = 44;
新键自动转换为字符串,从而在 Stringify 中产生
{"1":11, "2": 22, "3": 33, "4": 44} //sans the '", for better readibility
令人困惑,但我想这就是你为一点无政府状态和易用性付出的代价。
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 不能从angular2中的子组件指定父组件中的数组
- 使用JS将数组转换为json对象
- 数组在递归方法中设置为null
- knockoutjs可观察数组
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 将数组从PHP传递到Javascript
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 在函数中添加数组元素的数值
- 我如何获得 Javascript 中关联数组和常规数组之间的区别
- 从两个常规数组创建一个关联数组
- 将Mongoose返回的数组转换为常规JSON
- 是否有一种方法可以使用MongoDB查询对象来过滤常规JavaScript数组
- 将具有唯一id的对象集合存储为以id作为键的关联数组,而不是作为常规数组,是否存在缺陷?
- 将JSON解析为常规JavaScript数组
- 从lodash填充与常规数组填充数组时产生的不希望的结果
- 灰烬排序一个可枚举数组或添加一个新对象到一个常规数组
- 从常规数组创建一个新的二维数组